Очевидная вещь, которая могла бы пойти не так, была бы, если бы v
не был правильно выровнен.
Но он распределяется динамически с помощью vector
, поэтому он не подвержен проблемам смещения стека.
Однако, как правильно указывает phooji , значение «template» или «prototype» передается конструктору std::vector
, который будет скопирован во все элементы вектора.Именно этот параметр std::vector::vector
будет помещен в стек и может быть смещен.
У некоторых компиляторов есть прагма для управления выравниванием стека внутри функции (в основном, компилятор тратит некоторое дополнительное пространство, необходимое для получениявсе локальные объекты правильно выровнены).
Согласно документации Microsoft, Visual C ++ 2010 должен автоматически настроить 8-байтовое выравнивание стека для типов SSE , и делает это с Visual C ++ 2003
Для gcc я не знаю.
Под C ++ 0x, для new point()
возвращать невыровненное хранилище - серьезное несоответствие.[basic.stc.dynamic.allocation]
говорит (формулировка из черновика n3225):
Функция выделения пытается выделить запрошенный объем памяти.Если он успешен, он должен вернуть адрес начала блока хранения, длина которого в байтах должна быть, по крайней мере, такой же, как запрашиваемый размер.Нет ограничений на содержимое выделенного хранилища при возврате из функции выделения.Порядок, смежность и начальное значение хранилища, выделенного последовательными вызовами функции выделения, не определены.Возвращаемый указатель должен быть соответствующим образом выровнен, чтобы его можно было преобразовать в указатель любого полного типа объекта с фундаментальным требованием выравнивания (3.11), а затем использовать для доступа к объекту или массиву в выделенном хранилище (пока хранилище не будет явно освобожденовызов соответствующей функции освобождения).
И [basic.align]
говорит:
Кроме того, запрос на динамическое хранение во время выполнения, для которого запрошенное выравнивание не может бытьhonored должно рассматриваться как сбой при выделении.
Можете ли вы попробовать более новую версию gcc, где это может быть исправлено?