Преамбула для мікрооптимізаторів
Пам'ятайте:
"Програмісти витрачають величезну кількість часу на роздуми або занепокоєння швидкості некритичних частин своїх програм. Ці спроби ефективності насправді мають сильний негативний вплив при розгляді налагодження та обслуговування. Ми повинні забути про невелику ефективність, скажімо про 97% часу: передчасна оптимізація - корінь усього зла. Але ми не повинні пропускати свої можливості на критичних 3% ".
(Завдяки метаморфозі за повну цитату)
Не використовуйте масив C замість вектора (чи будь-якого іншого) лише тому, що ви вважаєте, що це швидше, оскільки він повинен бути нижчого рівня. Ви помиляєтесь.
Використовуйте вектор за замовчуванням (або безпечний контейнер, адаптований до ваших потреб), а потім, якщо ваш профайлер каже, що це проблема, подивіться, чи можете ви їх оптимізувати, використовуючи кращий алгоритм або змінивши контейнер.
Це сказав, що ми можемо повернутися до початкового питання.
Статичний / динамічний масив?
Класи масивів C ++ краще поводяться, ніж низькорівневий масив C, оскільки вони багато що знають про себе, і відповідати на запитання масивів C не можуть. Вони здатні чистити після себе. І що ще важливіше, вони зазвичай записуються за допомогою шаблонів та / або вбудованих даних, а це означає, що те, що виявляється у великій кількості коду в налагодженні, дорівнює чи мало коду, що створюється у складанні випусків, що не означає різниці з їх вбудованою менш безпечною конкуренцією.
Загалом, він поділяється на дві категорії:
Динамічні масиви
Використання вказівника на масив malloc-ed / new-ed буде в кращому випадку таким же швидким, як версія std :: vector, і набагато менш безпечним (див. Пост лаб ).
Тому використовуйте std :: vector.
Статичні масиви
Використання статичного масиву буде в кращому випадку:
Тому використовуйте масив std :: .
Неініціалізована пам'ять
Іноді, використовуючи vector
замість сирого буфера, виникає видима вартість, оскільки vector
ініціалізація буфера при створенні, тоді як код, який він замінює, ні, як зауважив Берні у своїй відповіді .
Якщо це так, то ви можете впоратися з цим, скориставшись unique_ptr
замість vector
або, якщо випадок не є винятковим у вашій кодовій шкалі, насправді напишіть клас, buffer_owner
який буде володіти цією пам'яттю, і забезпечить вам легкий і безпечний доступ до нього, в т.ч бонуси, такі як зміна розміру (використання realloc
?) або все, що вам потрібно.