web-dev-qa-db-ja.com

非標準のメモリアクセスについて規格は何と言っていますか?

非境界整列アクセスについて標準を検索しましたが、何も見つかりませんでした(多分私は不注意でした)。

未定義の動作ですか?実装は定義されていますか?

現在のCPUの多くは非境界整列アクセスをサポートしているため、非境界整列メモリアクセスは実装定義であることが賢明です。それは事実ですか?

アライメントされていないアクセスとは、たとえば次のことを意味します。

alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;
23
geza

いいえ、UBです。整列されていないメモリでオブジェクトのライフタイムを開始することはできません。から [basic.life] p1

タイプ[〜#〜] t [〜#〜]のオブジェクトの寿命は、次の場合に始まります。

  • タイプ[〜#〜] t [〜#〜]の適切な配置とサイズのストレージが取得されます。

  • オブジェクトに空でない初期化がある場合、その初期化は完了しています。

[...]

したがって、あなたの例では、xによって参照されるオブジェクトの存続期間はまだ始まっていないため、 [basic.life] p6 で言及されている以外のその使用法はUBです。

しかし、実装で許可されているのは、(使用されている基本的なアーキテクチャで指定されている)非整列メモリが実際に整列されているため、コードがC++抽象マシンで有効になるということです。ただし、コンパイラがこれを行うかどうかはわかりません。

21
Rakete1111