Этот вопрос получил довольно замораживающий прием в SO, поэтому я решил удалить его там и попробовать здесь. Если вы думаете, что он здесь не подходит, пожалуйста, по крайней мере, оставьте комментарий к предложению, как найти пример, который я ищу ...
Можете ли вы привести пример , когда использование C99 VLA дает реальное преимущество перед чем-то вроде современных стандартных механизмов C ++ RAII с использованием кучи?
Пример, за которым я следую, должен:
- Получите легко измеримое (возможно, 10%) преимущество в производительности по сравнению с использованием кучи.
- Не найдется хорошего обходного пути, для которого вообще не нужен весь массив.
- На самом деле выгода от использования динамического размера вместо фиксированного максимального размера.
- Маловероятно, чтобы вызвать переполнение стека в нормальном сценарии использования.
- Будьте достаточно сильны, чтобы соблазнить разработчика, которому нужна производительность, включить исходный файл C99 в проект C ++.
Добавим некоторые пояснения по контексту: я имею в виду VLA, как подразумевается под C99 и не входит в стандарт C ++: int array[n]
где n
переменная. И я приведу пример использования, где он превосходит альтернативы, предлагаемые другими стандартами (C90, C ++ 11):
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
Некоторые идеи:
- Функции, принимающие varargs, которые естественным образом ограничивают количество элементов до чего-то разумного, но не имеют никакого полезного верхнего предела уровня API.
- Рекурсивные функции, где ненужный стек нежелателен
- Много небольших распределений и выпусков, где куча накладных расходов будет плохой.
- Обработка многомерных массивов (например, матриц произвольного размера), где производительность критична, и ожидается, что небольшие функции будут много встроены.
- Из комментария: параллельный алгоритм, где распределение кучи имеет накладные расходы на синхронизацию .
В Википедии есть пример, который не соответствует моим критериям , потому что практическое различие в использовании кучи кажется несущественным, по крайней мере, без контекста. Это также неидеально, потому что без дополнительного контекста кажется, что количество элементов вполне может вызвать переполнение стека.
Примечание: я специально для примера кода или предложения алгоритма, который выиграл бы от этого, для меня, чтобы реализовать пример самостоятельно.
alloca
, который, я думаю, в основном одно и то же). Но эта многопоточная вещь хороша, редактирование вопроса, чтобы включить его!
malloc
поведение соответствует стандарту C.
alloca()
, действительно затмитmalloc()
в многопоточной среде из-за конфликта блокировки в последнем . Но это реальная растяжка, поскольку маленькие массивы должны просто использовать фиксированный размер, и большие массивы, вероятно, все равно будут нуждаться в куче.