Преамбула для микрооптимизаторов
Помните:
«Программисты тратят огромное количество времени на размышления или беспокойство по поводу скорости некритических частей своих программ, и эти попытки повышения эффективности на самом деле оказывают сильное негативное влияние при рассмотрении вопросов отладки и обслуживания. Мы должны забыть о небольшой эффективности, скажем о 97% времени: преждевременная оптимизация - корень всего зла. Однако мы не должны упускать наши возможности в эти критические 3% ».
(Благодаря метаморфозам за полную цитату)
Не используйте массив C вместо вектора (или чего-либо еще) только потому, что вы считаете, что он быстрее, так как предполагается, что он более низкого уровня. Ты был бы неправ.
Используйте вектор по умолчанию (или безопасный контейнер, адаптированный к вашим потребностям), и затем, если ваш профилировщик скажет, что это проблема, посмотрите, можете ли вы оптимизировать его, либо используя лучший алгоритм, либо изменив контейнер.
Тем не менее, мы можем вернуться к первоначальному вопросу.
Статический / Динамический Массив?
Классы массива C ++ ведут себя лучше, чем низкоуровневый массив C, потому что они много знают о себе и могут отвечать на вопросы, а массивы C не могут. Они умеют убирать за собой. И что еще более важно, они обычно пишутся с использованием шаблонов и / или встраивания, что означает, что то, что кажется для большого количества кода в отладке, разрешается в виде небольшого или нулевого кода, созданного в сборке релиза, что означает отсутствие различий с их встроенной менее безопасной конкуренцией.
В целом, это падает на две категории:
Динамические массивы
Использование указателя на массив malloc-ed / new-ed будет в лучшем случае таким же быстрым, как версия std :: vector, и намного менее безопасным (см. Сообщение от litb). ).
Так что используйте std :: vector.
Статические массивы
Использование статического массива будет в лучшем случае:
- так же быстро, как std :: array версия
- и намного менее безопасно.
Так что используйте std :: array .
Неинициализированная память
Иногда использование vector
буфера вместо необработанного буфера влечет за собой видимые затраты, потому что vector
он инициализирует буфер при построении, в то время как код, который он заменяет, этого не сделал, как заметил Берни в своем ответе. .
Если это так, то вы можете справиться с этим, используя unique_ptr
вместо vector
или или, если случай не является исключительным в вашей кодовой строке, на самом деле написать класс, buffer_owner
который будет владеть этой памятью, и дать вам простой и безопасный доступ к ней, в том числе бонусы, такие как изменение размера (использование realloc
?) или все, что вам нужно.