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