2013-05-07 11 views
7

特定のアラインメント要件を持つ単純なタイプを定義する場合、そのタイプのstd::vector<t>は、すべての単一のエレメントに対してアライメントを守るべきではないstd :: vector honor alignof(value_type)する必要がありますか?

次の例

typedef std::array<double,3> alignas(32) avx_point; 
std::vector<avx_point> x(10); 
assert(!(std::ptrdiff_t(&(x[0]))&31) && // assert that x[0] is 32-byte aligned 
     !(std::ptrdiff_t(&(x[1]))&31)); // assert that x[1] is 32-byte aligned 

を考えるIは、GCC 4.8.0は、それが無視される警告を発行しながら、(または-stdlib=libc++なし)3.2を打ち鳴らすことによって違反アライメント要件(警告なし)サイレントであることがわかっテンプレート引数の属性はstd::vectorです(intelコンパイラはalignasを理解するにはあまりにも愚かですが、代わりに__declspec(align(32))を使用すると、clangのように動作します)。両方とも、アサートをトリガーするコードを作成します。

これは正しく動作していますかclang(およびicpc)のバグですか、gccの問題ですか?コメントで提起質問に答える

編集 :私は

typedef typename std::aligned_storage<sizeof (avx_point), 
             alignof(avx_point)>::type avx_storage; 

を定義した場合、私は

sizeof (avx_storage) == 32; 
alignof(avx_storage) == 32; 

しかしstd::vector<avx_storage>はまだ最初の要素を整列するために失敗した(したがって、すべての取得他の人も)clangとgccのために(今回は警告なしに)。したがって、最初に、std::allocator<type>は、最初の要素であっても整列要件を無視します(illegal?)。次の要素の整列を確実にするために余白が適用されないという2つの問題が明らかです。

+0

「std :: vector >」を比較するとどうなりますか? – Useless

答えて

3

まず、そのSTD ::アロケータは

私はアロケータの専門家には程遠いんだ(?違法)でも最初の要素の任意の配置要件を無視しますが、それは残念ながら、と私には思われますこれは法的な行為です。より正確には、アロケータは要求されたアラインメントを無視するかもしれない。実際、[allocator.requirements]、17.6.3.5/6状態は:

特定にわたって整列タイプに関連付けられた位置合わせがアロケータによってサポートされていない場合、そのタイプのアロケータのインスタンス が失敗することがあります。 アロケータは、要求されたアライメントをサイレントに無視することもできます。

あなた自身のアロケータを書くことで、メモリを整列させることができます。著作権の理由から残念ながら、コードを公開することはできません:-私が言うことができるのは、_aligned_malloc_aligned_free(Microsoftの拡張機能)に基づいています。あなたは、Googleが「整列アロケータ」といくつかのオプションのために、私はこの整列アロケータの作者ではないと私はそれを使ったことがないことを強調

https://gist.github.com/donny-dont/1471329

そのうちの1つは、出てくることができます。

更新

上記整列アロケータは、Visual Studio/Windows用ですが、それは他のプラットフォーム上で整列アロケータを実装するためのベースとして使用することができます。 posix memalignファミリまたはC11ファンクションaligned_allocを使用することができます。

this投稿を参照してください。

+1

キーワードalignasとalignofを導入してアロケータが無視できるようにするための標準の論理は何ですか? btw、私は自分の 'aligned_allocator <>'を持っています。これは非常にうまく動作します(著作権の問題はありません)。 – Walter

関連する問題