2 つの質問があります。1 つはポインターの型操作全般に関する一般的な質問で、もう 1 つは私が持っている特定のケースに関する質問です。
異なる型のポインタを使用してメモリのバッファにアクセスするとどうなりますか?
多くの異なるコンパイラで実際に実行してみると、私の脳が想像した通りに動作するようです。ただし、多くの場合(すべてではないにしても)UBであることはある程度知っています。例えば:
typedef unsigned char byte;
struct color { /* stuff */};
std::vector<color> colors( 512 * 512 );
// pointer of one type
color* colordata = colors.data();
// pointer to another type?
byte* bytes = reinterpret_cast<byte*>( colordata );
// Proceed to read from (potentially write into)
// the "bytes" of the 512 * 512 heap array
最初の質問は次のとおりです。この種の変換を行うことが合法/安全/標準で認可されているポイントはありますか?
struct
2 番目の質問:名前付きが次のcolor
ように定義されていることがわかっている場合は、最初の質問をスピンオフします。
struct color { byte c[4]; };
さて、それは合法/安全/標準認可ですか? 読み取り安全?読み取り/書き込みは安全ですか? 私の直感では、これらの非常に単純な構造体の場合、上記のいたずらなポインター操作はそれほど悪くないことがわかります。
[ 再度開く理由: ] 厳密なエイリアシングに関するリンクされた質問はここでは多少当てはまりますが、ほとんどは C に関するものです。C++03 標準を参照する 1 つの回答は、C++11 標準と比較すると時代遅れになる可能性があります (まったく何も変更されていない場合を除きます)。 )。この質問には実用的なアプリケーションがあり、私や他の人はより多くの回答を得ることができます. 最後に、この質問は、読み取りセーフ、書き込みセーフ、またはその両方ではないか (またはどちらでもないか)、および 2 つの異なるシナリオ (基になる型が一致する PoD データと、任意の内部データのより一般的なケース) であるかどうかを尋ねる非常に具体的な質問です。 )。