C++ での型パニング ポインター/配列の規則に興味があります。現時点で私が持っているユースケースは次のとおりです。
データのバイナリ BLOB を 32 ビット整数の配列として扱い (全体の長さが 4 の倍数であることはわかっています)、すべての値を合計してオーバーフローを無視することにより、単純な 32 ビット チェックサムを計算します。
このような関数は次のようになると思います。
uint32_t compute_checksum(const char *data, size_t size)
{
const uint32_t *udata = /* ??? */;
uint32_t checksum = 0;
for (size_t i = 0; i != size / 4; ++i)
checksum += udata[i];
return udata;
}
data
今私が持っている質問は、変換するための「最良の」方法は何だと思いますudata
か?
Cスタイルキャスト?
udata = (const uint32_t *)data
すべてのポインターが変換可能であると仮定する C++ キャスト?
udata = reinterpret_cast<const uint32_t *>(data)
C++ は、中間を使用して任意のポインター型間でそれをキャストしvoid*
ますか?
udata = static_cast<const uint32_t *>(static_cast<const void *>(data))
組合を通してキャストしますか?
union {
const uint32_t *udata;
const char *cdata;
};
cdata = data;
// now use udata
これが 100% 移植可能なソリューションではないことは十分承知していますが、機能することがわかっている少数のプラットフォームでのみ使用することを期待しています (つまり、アラインされていないメモリ アクセスとポインター エイリアシングに関するコンパイラの仮定)。あなたは何をお勧めします?