Это на самом деле зависит от вашей платформы и реализации вашего компилятора new
и memmove
. Большинство процессорных архитектур лучше перемешивают данные, когда они выровнены по границам слов, но у некоторых есть дополнительные случаи, когда они работают лучше. Например, PowerPC 7447 работает быстрее всего с памятью, выровненной по границам 16 байт . Это размер векторных регистров для его набора команд Altivec SIMD, так что memcpy или аналогичная функция может быть реализована намного быстрее для массивов, которые расположены на границах 16 байтов. См. этот вопрос для примера.
Почему это имеет значение для новых? Поскольку новый оператор может хранить некоторые метаданные о выделенном блоке памяти в паре байтов перед указателем, который он возвращает, то фактический указатель, который он вам дает, представляет собой слово или два после фактического начала выделения. На процессоре, ОС и компиляторе, где я столкнулся с этим поведением (PowerPC 7447a, VxWorks 5.5, GCC 2.95), новый оператор гарантированно предоставил вам блоки, которые были выровнены на 8 байтов, но не выровнены на 16 байтов. Это, конечно, очень зависит от реализации. Я не верю, что в стандарте C ++ есть что-то, что определяет выравнивание, поскольку это будет оптимизация для конкретной архитектуры.
Смысл всего этого в том, что это может немного изменить производительность, если вы работаете на определенной платформе и заботитесь о проблемах оптимизации низкого уровня, таких как выравнивание. Вам, вероятно, не нужно беспокоиться об этом для большинства приложений.