2017-11-25 9 views
1

次のコードは、クロスコンパイル可能ですか?言い換えればメモリアライメント保証

struct Foo { 
    alignas(1) char c1; 
    alignas(1) char c2; 
    alignas(4) int i; 
}; 
static_assert(sizeof(Foo) == (sizeof(int) + 4), "No cross-compilable"); 

は、それがどのようなアーキテクチャ/プラットフォーム用のsizeof(Foo) == (sizeof(int) + 4)ことが保証されていますか?

+0

厳密に言えば、私は言いません。私はアライメント仕様がパディングのオプションを否定するとは思わない。 – StoryTeller

+0

@StoryTeller私は '+ 4'(つまり、パディングのために' + 2')を考慮しました。 –

+1

それは事です。パディングは本当に縛られていません。あなたが指定した金額を超過する可能性は低いですが、実際には縛られていません。 – StoryTeller

答えて

2

保証されていません。これは今日の多くのアーキテクチャーで機能しますが、8バイトの境界(8バイトの境界に整列)のシステムでは、これは機能しません。しかし、この場合、intにあまり厳密ではない整列を適用しようとしているので、コンパイラー診断を取得する必要があります。 [dcl.align]を参照してください。

+0

「8-byte int arch」で動作しない理由について詳しく説明できますか? –

+0

@BiagioFesta 'int'が8バイトアライメントの場合、' Foo'内の 'i'のオフセットは8になり、sizeof(Foo)は16になります。 – 1201ProgramAlarm

+0

あなたはそうです!したがって 'alignof(int)+ sizeof(int)== sizeof(Foo)'は正しいでしょうか? (注: 'int'のための' alignas(4) 'が削除されています) –

関連する問題