[解決済み] メモリーアライメント: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は基本的なデータ型の最小のアライメント要件を事前に知るための良い方法です(おそらく、charsは1、floatは4などを返すでしょう)。
まだ合法です。
alignas(alignof(float)) float SqDistance;
アライメントが16のものは、16の倍数である次の利用可能なアドレスに配置されます。 (最後に使用されたアドレスから暗黙のパディングがあるかもしれません)。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む