Это сильно зависит от того, что находится в закомментированных разделах.Как написано, если вы поместите это в функцию и просто вернете b
примерно так:
int example() {
int b = 0;
// more stuff here
for ( int i = 0; i < 100; ++i ) {
if ( !b ) {
b = 1;
} else {
// do some other stuff
}
}
return b;
}
Если вы указали -O2
или выше, тогда gcc 4.4.7 ипозже скомпилируйте это в :
example():
mov eax, 1
ret
Таким образом, он полностью оценивает цикл.С другой стороны, если у вас есть что-то, что зависит от b
и i
, например, так:
extern int doSomeOtherStuff(int b, int i);
int example() {
int b = 0;
// more stuff here (that doesn't interfere with b)
for ( int i = 0; i < 100; ++i ) {
if ( !b ) {
b = 1;
} else {
doSomeOtherStuff(b, i);
}
}
return b;
}
Затем это компилируется ( по 4.4.7 ) в:
example():
push rbx
xor ebx, ebx
jmp .L2
.L3:
mov esi, ebx
mov edi, 1
call doSomeOtherStuff(int, int)
.L2:
add ebx, 1
cmp ebx, 100
jne .L3
mov eax, 1
pop rbx
ret
Здесь мы видим, что инструкция mov edi, 1
соответствует аргументу b
, который всегда равен 1
, когда вызывается doSomeOtherStuff
.В GCC 8.1 это достаточно умно, чтобы развернуть цикл до первого вызова до doSomeOtherStuff
, в то время как 4.4.7 испускает весь цикл.