2012-02-12 22 views
2

structは、常にその構造体の最大整列メンバーと同じに整列されていますか?そうでない場合は、gcc固有の拡張機能を使用して、これを自動的にどのように強制することができますか? (私は__attribute((aligned(...)))__があると知っていますが、アラインメントは明示的に指定しなければなりません)。構造体の整列したメンバーとのC++の整列

この動作はc99、C++ 99、およびC++ 11では異なりますか? C++ 11にはアライメントを強制するための追加の規定がありますか?

例:次のコードで 、自動的に8バイトに整列され、それ自体をFooます、または私も明示的に整列する必要がありますか?

struct Foo{ 
    int i __attribute__((aligned(8))); 
}; 
+0

なぜあなたは正確に尋ねますか? –

+0

@Basile:例を追加しました。 – eudoxos

+0

複合型の配置は、実際にはその最大のメンバーの配置です。これらのタイプの配列について考えてみましょう! –

答えて

1

アライメントは、システムおよびプロセッサ固有のプロパティです。コンパイラは、プロセッサとシステムのアライメントの制約について知っておく必要があります。

ほとんどのABI仕様(たとえば、Linuxの場合AMD64 ABI)には、いくつかの調整ヒントが含まれています。

アラインメントの制約は、フィールドからそれらを含む集計(例:struct -s)に伝播すると考えられます。

動的に割り当てられたデータに通常とは異なる配置制約がある場合は、配置を明示する必要があります。それらを割り当てるにはposix_memalignを使用します。 mallocと関連するアロケータ(C++では::operator newを含む)は、おそらくデフォルトの制約に必要なものよりも整列しないでしょう。

関連する問題