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

Другие вопросы по тегам