私は gcc 4.9.2 を使用しており、AVX で使用するために静的に初期化された配列を適切に整列させようとしています。アラインメントの問題により segfault が発生するコードの要点は次のとおりです。
#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 の静的に割り当てられたメンバーへのポインターを作成すると、正しく機能します。main 内にローカル変数 *b1 と *b2 を作成すると、正常に動作します。クラス A と posix_memalign 内で動的に割り当てられた配列を使用すると、正しく動作します。
私はアライナスについて何か誤解していますか?