MGM, покажите, пожалуйста, больший фрагмент - из которого понятно, как вы сделали вывод, что происходит выход из цикла. В идеале - вообще минимально работающий демонстрирующий этот эффект пример.
При всём уважении, почти наверняка это ошибка у вас, а не в компиляторе.
Компилятор
с -O2 и выше просто выкидывает оба цикла
Имеет право - наблюдаемое поведение не меняется.
Он и более сложные штуки может выкинуть (вплоть до суммы арифметической прогрессии ЕМНИП).
Я отлаживал кусок программы, и в дебагере и ставил метку внутри цикла.
Если if имел место быть, то вместо 80 раз на метку выходил лишь раз.
Вот код. Сейчас он работает, но если раскомментить if таже история.
Код:
uint64_t * make_crk_census(int X, int Y, BYTE * im)
{
uint64_t x64[64];
float *img = new float[X*Y];
POINT *xy = new POINT[64];
/////////
Здесь баг: Код:
int cnt = 0;
for(int i = -4; i <= 4; i++)
for (int j = -4; j <= 4; j++)
{
bool zr = i != 0 || j != 0;
float r = sqrt((float)(i*i + j*j));
int ri = i < 0 ? (int)(r + 0.5): (int)(r + 0.6);
int rr = 0;
if (zr && ri < 5) { xy[cnt].x = i; xy[cnt].y = j; cnt++; }
}
/////////
далее Код:
for (int p = 0; p < X*Y; p++) img[p] = 0.11*im[p] + 0.59*im[p + X*Y] + 0.3*im[p + 2 * X*Y];
uint64_t * out = new uint64_t[X*Y];
x64[0] = 1; for (int i = 1; i < 64; i++)x64[i] = x64[i - 1] * 2;
for (int p = 0; p < X*Y; p++)
{
out[p] = point_crk_census(p%X, p / X, X, Y, img, x64, xy);
}
delete[] img;
delete[] xy;
return out;
}
Ошибка - врядли, но вот глюк оптимизатора - может быть.
Хотя на стадии отдадки я вообще забанил все в подпрограмме, что не относилось непосредственно к заполнению массива POINT xy, как и само заполнение.