Це питання отримало досить заморожений прийом на 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
Деякі ідеї:
- Функції, що приймають вараги, що, природно, обмежує кількість елементів до чогось розумного, але не має жодної корисної верхньої межі рівня API.
- Рекурсивні функції, де витрачається стек небажано
- Багато невеликих асигнувань і випусків, де купа грошових витрат буде поганою.
- Обробка багатовимірних масивів (на зразок матриць довільного розміру), де продуктивність є критичною, а малі функції, як очікується, будуть багато вбудовані.
- З коментаря: паралельний алгоритм, де розподіл купи має накладні синхронізації .
У Вікіпедії є приклад, який не відповідає моїм критеріям , оскільки практична різниця у використанні купи здається неактуальною принаймні без контексту. Це також неідеально, оскільки без більшого контексту, здається, що кількість елементів може дуже добре спричинити переповнення стека.
Примітка. Я спеціально після прикладу коду чи пропозиції алгоритму, який би виграв від цього, щоб я сам застосував приклад.
alloca
, що, на мою думку, в основному одне і те ж). Але ця багатопотокова річ хороша, редагуючи питання, щоб включити її!
malloc
відповідає поведінка Linux стандарту C.
alloca()
, справді затьмаритьmalloc()
у багатопотоковому середовищі через суперечки замка в останньому . Але це справжня розтягнення, оскільки малі масиви повинні просто використовувати фіксований розмір, а великим масивам, напевно, потрібна буде купа.