Проблема gcc alignas с указателями на объекты
Я использую gcc 4.9.2 и пытаюсь правильно выровнять статически инициализированные массивы для использования с AVX. Вот суть кода, который вызывает ошибки из-за проблем с выравниванием:
#include <iostream>
#include <cstddef>
struct B {
alignas(32) double x[1] = {0};
};
struct A
{
A() { b1 = new B(); b2 = new B(); }
B* b1;
B* b2;
};
int main(int argc, char** argv) {
A a;
int ret = (ptrdiff_t) a.b1->x % 32 + (ptrdiff_t) a.b2->x % 32;
std::cout << (ptrdiff_t) a.b1->x % 32 << "," << (ptrdiff_t) a.b2->x % 32 << "\n";
return ret;
}
В моей системе массив a.b2->x не выровнен по границе 32 байта. Размер x не имеет значения, если x является массивом (так что "double x = 0" работает нормально). Если вместо этого я сделаю указатели на статически распределенные элементы B, это будет работать правильно. Если я создаю локальные переменные *b1 и *b2 внутри main, это работает правильно. Если я использую динамически размещенные массивы внутри класса A и posix_memalign, это работает правильно.
Я что-то недопонимаю по поводу alignas.
1 ответ
Если я правильно понимаю, из следующего документа
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm
new
не обязательно уважать alignas
,