2013-11-12 3 views
2

У меня есть класс:В каких случаях __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 о выравнивании, но неясно, работает ли она для динамического распределения.

+2

Нет, это не сработает, пресловутая проблема на C++. Компилятор знает требования к выравниванию для объекта, но просто не имеет возможности передать это знание распределителю. Исправление этого в спецификации языка является серьезным изменением. –

ответ

7

с __declspec(align(#)) является директивой компиляции, создавая объект MatrixWrapper с новым оператором, может привести к неравномерной памяти в куче. Вы можете использовать _aligned_malloc и распределять память динамически, например, в конструкторе, а затем освобождать его с помощью _aligned_free в деструкторе, тем самым смешивая статическое и динамическое распределение объекта, что усложняет задачу.

+0

Хотя MS говорит # может быть до 8192, практически я получаю ошибку за #> 128. Вы ее видели? это документация MS - https://msdn.microsoft.com/en-us/library/83ythb65.aspx. – Royi

Смежные вопросы