最近、厳密なエイリアシングについてよく読んでいます。a
C/C++ 標準では、次のコードは無効であると述べられています(未定義の動作が正しい) b
。
float *a;
...
int *b = reinterpret_cast<int*>(a);
*b = 1;
標準では、char*
何でもエイリアスできると述べているため、char*
変数への書き込みアクセスが行われるたびに、コンパイラーはキャッシュされたすべての値をリロードします。したがって、次のコードは正しいでしょう。
float *a;
...
char *b = reinterpret_cast<char*>(a);
*b = 1;
しかし、ポインターがまったく関与していない場合はどうでしょうか? たとえば、次のコードがあり、GCC は厳密なエイリアシングに関する警告をスローします。
float a = 2.4;
int32_t b = reinterpret_cast<int&>(a);
私がやりたいのは、の生の値をコピーa
することだけなので、厳密なエイリアシングは適用されません。ここに問題がある可能性がありますか、それとも GCC がそれについて過度に用心深いだけですか?
編集
memcpyを使用した解決策があることは知っていますが、コードが読みにくくなるため、その解決策を使用したくありません。
EDIT2
int32_t b = *reinterpret_cast<int*>(&a);
も機能しません。
解決した
これはGCC のバグのようです。