Проблема 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.

3

Решение

Если я правильно понимаю, из следующего документа

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm

new не обязательно уважать alignas,

1

Другие решения

Других решений пока нет …