3

私は 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 内で動的に割り当てられた配列を使用すると、正しく動作します。

私はアライナスについて何か誤解していますか?

4

1 に答える 1

1

私が正しく理解していれば、次のドキュメントから

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

newを尊重する必要はありませんalignas

于 2016-04-08T21:35:20.280 に答える