2016-04-08 13 views
3

gcc 4.9.2を使用していますが、AVXで使用するために静的に初期化された配列を正しく整列しようとしています。ここに起因するアライメントの問題にセグメンテーションフォルトコードの要旨は次のとおりです。私のシステムでgcc alignasオブジェクトへのメンバポインタの問題

#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の中で動的に割り当てられた配列を使うと、正しく動作します。

私はalignasについて何か誤解していますか?

答えて

1

私が正しく理解していれば、次の文書

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

newからalignasを尊重するために必須ではありません。

+0

注意、 'posix_memalign'を呼び出すカスタム'演算子new'を実装することができます。 – o11c

+0

また、gcc-bugzillaにバグを投稿し、同様の回答を得ました:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70603 – kounoupis

関連する問題