snappy の内部には、reinterpret_cast されたポインターの逆参照を選択する条件付きでコンパイルされたセクションがあります。これは、そのような操作をサポートすることが知られているアーキテクチャ上で、アライメントされていない可能性のある 16、32、および 64 ビット整数の読み取りと書き込みの最適な実装として選択します ( x86)。他のアーキテクチャのフォールバックは、memcpy ベースの実装を使用することです。
私の理解では、 reinterpret_cast 実装は未定義の動作を示し、clang の未定義動作サニタイザーはそれにフラグを立てます。
私を困惑させているのは、memcpyベースの実装を使用しないのはなぜですか? サイズはコンパイル時にわかっているため、最も壊れたコンパイラを除くすべてのコンパイラが組み込み関数を使用してこれらの memcpy 呼び出しを実装することを期待しています。実際、最新のツールチェーンの両方の実装から同一のコード生成が期待されます。
ただし、snappy は、その内容を熟知している人々によって書かれたものであることも認識しています。したがって、未定義の動作であることを上回る reinterpret_cast メカニズムを使用する利点がまだあるかどうか疑問に思います。パフォーマンスをコンパイラの実装品質に依存させたくないですか? 私が考慮していない他の何か?