多くの SSE コンパイラ組み込み関数を使用して 3D ベクトル クラスを作成しました。new のメンバーとして 3D ベクトルを持つクラスを開始するまで、すべてがうまくいきました。リリース モードでは奇妙なクラッシュが発生しましたが、デバッグ モードでは発生しませんでした。
そこで、いくつかの記事を読んで、3D ベクター クラスのインスタンスを所有するクラスも 16 バイトに揃える必要があると考えました。したがって、次のようにクラスの前に_MM_ALIGN16
( ) を追加しました。__declspec(align(16)
_MM_ALIGN16 struct Sphere
{
// ....
Vector3 point;
float radius
};
それは最初に問題を解決するように見えました。しかし、いくつかのコードを変更した後、私のプログラムは奇妙な方法で再びクラッシュし始めました。さらにウェブを検索したところ、ブログ記事を見つけました。この問題を解決するために著者の Ernst Hot が行ったことを試してみましたが、私にとってもうまくいきました。次のように、新しい演算子と削除演算子をクラスに追加しました。
_MM_ALIGN16 struct Sphere
{
// ....
void *operator new (unsigned int size)
{ return _mm_malloc(size, 16); }
void operator delete (void *p)
{ _mm_free(p); }
Vector3 point;
float radius
};
Ernst は、このアプローチにも問題がある可能性があると述べていますが、問題が発生する理由を説明せずに、もはや存在しないフォーラムにリンクしているだけです。
だから私の質問は:
演算子を定義する際の問題は何ですか?
_MM_ALIGN16
クラス定義への追加が十分でないのはなぜですか?SSE 組み込み関数に伴うアラインメントの問題を処理する最善の方法は何ですか?