Я думаю, проблема в том, что компилятор не может гарантировать, что указатель стека будет правильно выровнен, когда он создает объект _Vector3D
в стеке для передачи конструктору.
В 32-битных системах указатели стека обычно гарантированно выровнены по 4 байтам (иногда по 8 байтам), а в 64-битных системах я думаю, что указатель стека обычно гарантированно выровнен по 8 байтам, поэтому компилятор этого не делает. знать, когда он вызовет конструктор, что стек будет правильно выровнен. Возможно, вам потребуется передать указатель или ссылку.
Обратите внимание, что malloc()
и друзья, гарантированное выравнивание, возвращаемое для блока, иногда не гарантирует, что оно сможет обрабатывать специальные типы, подобные этому. В этом случае платформа будет иметь специальную функцию распределения для размещения этих объектов.
Дополнительные сведения о MSVC см. в следующем документе (http://msdn.microsoft.com/en-us/library/aa290049.aspx):
Выравнивание стека
На обеих 64-битных платформах вершина каждого кадра стека выравнивается по 16 байтам. Хотя при этом используется больше места, чем необходимо, это гарантирует, что компилятор сможет разместить все данные в стеке таким образом, чтобы все элементы были выровнены.
Компилятор x86 использует другой метод выравнивания стека. По умолчанию стек выровнен по 4 байтам. Хотя это экономит место, вы можете видеть, что есть некоторые типы данных, которые необходимо выровнять по 8 байтам, и что для получения хорошей производительности иногда требуется выравнивание по 16 байтам. В некоторых случаях компилятор может определить, что динамическое выравнивание стека по 8 байтам будет полезным, особенно когда в стеке есть двойные значения.
Компилятор делает это двумя способами. Во-первых, компилятор может использовать генерацию кода во время компоновки (LTCG), если это указано пользователем во время компиляции и компоновки, для создания дерева вызовов для всей программы. Благодаря этому он может определить области дерева вызовов, где 8-байтовое выравнивание стека было бы полезным, и определить сайты вызовов, где динамическое выравнивание стека дает наибольшую отдачу. Второй способ используется, когда функция имеет дубли в стеке, но по какой-то причине еще не выровнена по 8 байтам. Компилятор применяет эвристику (которая улучшается с каждой итерацией компилятора), чтобы определить, должна ли функция динамически выравниваться по 8 байтам.
Примечание. Недостатком динамического 8-байтового выравнивания стека с точки зрения производительности является то, что пропуск указателя кадра (/Oy) эффективно отключается. Регистр EBP должен использоваться для обращения к стеку с динамическим 8-байтовым стеком, поэтому его нельзя использовать в качестве общего регистра в функции.
В приведенной выше статье также есть некоторая информация о специальных функциях кучи, которые обеспечивают гарантии выравнивания выше, чем стандартные malloc()
, если вам это нужно.
person
Michael Burr
schedule
28.10.2009
_Vector3D
то, что должно быть матрицей 3x4. каждый из __m128 представляет собой набор из 4 поплавков. - person LiraNuna   schedule 28.10.2009