現在、共有メモリを使用しています。
私は理解できないalignof
とalignas
。
cppreferenceが不明確です: alignof
"alignment" を返しますが、"alignment" とは何ですか? 次のブロックを整列するために追加するバイト数? パッド入りサイズ? スタック オーバーフロー/ ブログのエントリも不明です。
誰かが明確に説明できますalignof
かalignas
?
現在、共有メモリを使用しています。
私は理解できないalignof
とalignas
。
cppreferenceが不明確です: alignof
"alignment" を返しますが、"alignment" とは何ですか? 次のブロックを整列するために追加するバイト数? パッド入りサイズ? スタック オーバーフロー/ ブログのエントリも不明です。
誰かが明確に説明できますalignof
かalignas
?
アラインメントとは、値の最初のバイトを格納できるメモリ位置の制限です。(プロセッサのパフォーマンスを向上させ、特定の境界整列を持つデータでのみ機能する特定の命令の使用を許可するために必要です。たとえば、SSE は 16 バイトに整列する必要があり、AVX は 32 バイトに整列する必要があります。)
16 のアラインメントは、16 の倍数であるメモリ アドレスのみが有効なアドレスであることを意味します。
alignas
必要なバイト数にアラインメントを強制します。1、2、4、8、16、32、64、128、... の 2 の累乗にのみ整列できます。
#include <cstdlib>
#include <iostream>
int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}
出力例:
0xbfa493e0
0xbfa49000 // note how many more "zeros" now.
// binary equivalent
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000 // every zero is just a extra power of 2
もう一つのキーワード
alignof
非常に便利です。次のようなことはできません
int a[4];
assert(a % 16 == 0); // check if alignment is to 16 bytes: WRONG compiler error
しかし、あなたはすることができます
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
実際には、これは単純な「%」(モジュラス) 演算よりも厳密であることに注意してください。実際、1024 バイトにアラインされたものは、必然的に 1、2、4、8 バイトにアラインされることがわかっていますが、
assert(alignof(b) == 32); // fail.
より正確には、「alignof」は、何かが整列されている 2 の最大のべき乗を返します。
また、alignof は、基本的なデータ型の最小アラインメント要件を事前に知る良い方法です (おそらく、char の場合は 1、float の場合は 4 などを返します)。
まだ合法:
alignas(alignof(float)) float SqDistance;
16 のアラインメントを持つものは、16 の倍数である次の使用可能なアドレスに配置されます(最後に使用されたアドレスからの暗黙のパディングがある場合があります)。
アライメントはパディングではありません (ただし、アライメント要件を満たすためにパディングが導入されることがあります)。これは、C++ 型の組み込みプロパティです。標準語にすると ( 3.11[basic.align]
)
オブジェクト型には、その型のオブジェクトを割り当てることができるアドレスに制限を設けるアラインメント要件 (3.9.1、3.9.2) があります。アラインメントは、特定のオブジェクトを割り当てることができる連続したアドレス間のバイト数を表す実装定義の整数値です。オブジェクト型は、その型のすべてのオブジェクトにアラインメント要件を課します。整列指定子 (7.6.2) を使用して、より厳密な整列を要求できます。