У меня есть класс:В каких случаях __declspec (align (#)) не работает?
class CMatrix4f
{
public:
CMatrix4f();
public:
__declspec(align(16)) float m[16];
};
Этот класс реализует матричные операции с SSE, так m
должны быть выровнены для его работы. И он работает большую часть времени, но иногда я получаю segfault при выполнении инструкций SSE, таких как _mm_load_ps
, потому что m
не выравнивается по 16 байт. До сих пор я не могу понять, в каких случаях это происходит.
Когда я делаю CMatrix4f * dynamicMatrix = new CMatrix4f();
, есть dynamicMatrix.m
, возможно, будет выровнено?
Если у меня есть класс:
class MatrixWrapper {
public:
MatrixWrapper();
CMatrix4f _matrix;
};
, а затем сделать:
MatrixWrapper * dynamicMatrixWrapper = new MatrixWrapper();
Гарантируется ли dynamicMatrixWrapper._matrix.m
быть выровнены?
Я прочитал статью MSDN о выравнивании, но неясно, работает ли она для динамического распределения.
Нет, это не сработает, пресловутая проблема на C++. Компилятор знает требования к выравниванию для объекта, но просто не имеет возможности передать это знание распределителю. Исправление этого в спецификации языка является серьезным изменением. –