ベクトル化を目的とした次の関数を検討してください。
void AddSqr(float* restrict dst, float* restrict src, int cnt)
{
for (int i=0; i<cnt; i++) dst[i] = src[i] * src[i];
};
もちろん、srcとdstがエイリアスされていない場合、これは機能します。しかし、src == dst の場合はどうでしょうか? もちろん、src == dst+1 などの極端なケースは許可されません。しかし、ポインターが同じであれば、問題はないはずです。それとも、何か不足していますか?
編集: restrict は Intel C++ コンパイラのキーワードで、MSVC には __restrict があります。
この質問に対する私のポイントは、あらゆる種類のベクトル化がどのようにうまくいかないかがわかりません. dst が変更された場合、src 値が書き込まれたという事実は出力が計算されたことを意味するため、src 値はもう必要ありません。唯一のケースは、コンパイラが dst 自体を一時バッファとして使用した場合であり、これは正しくないと思います。