順序付き配列を使用するクリーク分割プログラムのパフォーマンスを向上させるために、ループの停止条件に、for
ループ先の配列の要素へのアクセスを含めました。
int myValue = 13;
for (int i=0; array[i] < myValue; i++)
{
//performing operations on the array
}
私の配列には 未満の値しか含まれていない可能性があるため、これは明らかに安全ではありませんmyValue
。
int myValue = 13;
for (int i=0; i < array.size() && array[i] < myValue; i++)
{
//performing operations on the array
}
この実装では、すべてがうまくいっているように見えますが、条件を切り替えると、最初の例と同じ問題に陥ります。
int myValue = 13;
for (int i=0; array[i] < myValue && i < array.size(); i++)
{
//performing operations on the array
}
i
したがって、これは明らかにコンパイラが 2 つの条件の順序を設定する方法によるものであると推測しました。最後のケースでは、が配列のサイズより大きくない場合にのみループに入るように要求しても、 m 以前に、配列の範囲外である可能性のある値を読み取っています。
私の質問は次のとおりです。2 番目の実装で行ったように、常に安全に実行できますか?それとも、コンパイラが制御条件を切り替えて、安全でないコードにつながることがありますか?
ありがとう。