N3485 C++ Standard Draft を読んでいて、配置に関するセクションで、次のように述べています。
3.11 アラインメント [basic.align]
1 ... アラインメントは、特定のオブジェクトを割り当てることができる連続するアドレス間のバイト数を表す実装定義の整数値です。オブジェクト型は、その型のすべてのオブジェクトにアラインメント要件を課します。整列指定子(7.6.2)を使用して、より厳密な整列を要求できます。
ここでは、アライメントとは何かを述べており、私はそれを理解しています。これは、32 ビット (4 バイト) システムを使用している場合、一度に 4 バイト サイズのチャンクを読み取るため、4 バイト オフセット アドレスのメモリに配置する必要があることを意味します。これの多くは優れたコンパイラによって処理されますが、C++ を使用すると、それについて意見を述べることができます。
それが話すアライメント指定子はですalignas
。
に整数を渡してalignas
、アライメント要件または次のようなタイプを指定できますalignas(double)
これで、次のように述べられている弱いまたは厳密なアライメントがあります。
5 アラインメントには、弱いアラインメントから強いアラインメント、または厳密な アラインメントへの順序があります。アラインメントが厳密なほど、アラインメントの値が大きくなります。アラインメント要件を満たすアドレスは、より弱い有効なアラインメント要件も満たします。
7 アラインメントを比較することは意味があり、明らかな結果が得られます。
— 2 つのアラインメントは、数値が等しい場合に等しくなります。
— 数値が等しくない場合、2 つのアラインメントは異なります。
—アラインメントが別のものよりも大きい場合、より厳密なアラインメントを表します。
したがって、ここでは、より厳密なアラインメントはより大きなアラインメントであると述べています。alignas(8)
それは単にそれがより厳密であることを意味しalignas(4)
ますか? 32 ビット (4 バイト) システムでは、バージョン 8 は、int
タイプが 1 回ではなく 2 回の読み取りを必要とし、1 回はパディングのみを必要とすることを意味します。このばかげた例のように、アラインメントが「誤用」された場合に、CPU に潜在的なオーバーヘッドを課すという事実を厳密に参照していますか?
特定のシステムですべてのアラインメントが有効であるとは限らず、正しい動作を生成するには拡張アラインメントが有効でなければならないことを認識しています。
私にとっての調整とは、CPU がメモリ データにワード サイズのチャンクでアクセスできるようにすることです。これは、CPU がメモリとの間でデータをフェッチおよび書き込むための最適な方法です。
私が理解しているように、この厳密な調整は、潜在的にそれを台無しにする可能性があります. 私が間違っている?厳密なアライメントと弱いアライメントとは何ですか?