Я видел бесчисленное количество вопросов в форме «Мне не нравится дополнение, как его отключить», но еще не нашел ничего о том, чтобы заставить компилятор предоставить дополнительное дополнение.
Конкретный случай, который у меня есть, выглядит как
struct particle{
vect2 s;
vect2 v;
int rX;
int rY;
double mass;
int boxNum;
};
Где vect2
— это просто struct {double x; double y;} vect2
. Чтобы использовать SSE2, мне нужно иметь возможность загрузить пару двойников, выровненных по 16-байтовым границам. Раньше это работало, пока я не добавил дополнительные int
, увеличив размер моей структуры с 48 до 56 байт. Результат - сегфоулты.
Есть ли какая-то директива компилятора, которую я могу использовать, которая либо говорит: «дополнить эту структуру, чтобы сделать ее длиной кратной 16 байтам», либо «эта структура имеет выравнивание 16 байтов»? Я знаю, что мог бы сделать это вручную (например, добавив дополнительный символ [12]), но я бы предпочел просто сказать компилятору (GCC, предпочтительно совместимый с ICC), и мне не нужно делать это вручную, если я изменю структура в будущем.
alignas
. - person ildjarn   schedule 22.06.2012vect2
с__m128
? Это должно указать gcc выровнять вашу структуру по 16 байтам в стеке. - person ecatmur   schedule 22.06.2012struct particle { vect2 s; ...; double mass; unsigned long : 32; unsigned long : 32; int boxNum; };
(в C вы можете переносимо использовать одно битовое полеunsigned long long : 64;
для заполнения, не уверен, есть ли в C++ переносимый целочисленный тип с ›= 64 битами). - person Daniel Fischer   schedule 22.06.2012long long
, но большинство компиляторов все равно поддерживали его как расширение С++ 03. - person ildjarn   schedule 23.06.2012