8

重複の可能性:
`T*` を `char*` でエイリアスすることは許可されています。逆も許されるの?

std::array次のように、 of s を使用して、char長さが 10 バイト以下の不明なプリミティブ型の値を保持しています。

std::array<char, 10> val;
*reinterpret_cast<double*>(val.data()) = 6.3;
//blah blah blah...
double stuff = *reinterpret_cast<double*>(val.data());

コンパイラは任意の型の値をエイリアスする可能性があるchar *と想定しているため、前後のキャストは未定義ではないことを読みました。これは、オブジェクト内の s のchar *配列に値が配置されている場合でも機能しますか?char

注:ここでユニオンを使用できることは承知していますが、それにより、私が行っていることに対して大量の定型コードが作成されるため、必要に応じて回避したいので、質問です。

4

2 に答える 2

13

はい、UBを誘発するためstd::array< char, 10 >のアライメント要件を満たしていません。doublereinterpret_cast

std::aligned_storage代わりに試してください。

于 2012-11-08T00:49:19.357 に答える
0

配列が何に含まれているかは問題ではありません。

標準では、何かを囲むものは考慮されていませんが (これは基本的なことです)、charシーケンスとの間の変換をサポートしています。

代入を介して直接これを行うreinterpret_castには、バッファを正しく配置する必要があります。

memcpy別の方法は、アライメントを気にしないを使用することです。

関連する問題については、通常、バイナリ レベルにまで下げることはお勧めできません。たとえば、コンパイラの単純なバージョン変更により、バイナリ シリアル化されたデータのファイルにアクセスできなくなる可能性があります。とにかくこれを行う主な要因は、生のパフォーマンスに関する考慮事項です。

于 2012-11-08T00:52:34.577 に答える