Так что я только что попробовал это с VS2010:
void foo(int* x, int* y, int length, int w) {
for (int i = 0; i < length; i++) {
x[i] = x[i] + y[i];
if (w) {
y[i] = 0;
}
}
}
int main() {
int x[1000];
int y[1000];
int w;
scanf("%d", &w);
foo(x, y, 1000, w);
int sum = 0;
for (int i = 0; i < 1000; i++) {
if (y[i])
sum++;
}
printf("%d\n", sum);
return 0;
}
Немного сложнее, чем необходимо, чтобы убедиться, что он не оптимизирует функцию. В любом случае это приводит к следующей разборке:
PUBLIC ?foo@@YAXPAH0HH@Z ; foo
; Function compile flags: /Ogtp
; COMDAT ?foo@@YAXPAH0HH@Z
_TEXT SEGMENT
?foo@@YAXPAH0HH@Z PROC ; foo, COMDAT
; _x$ = ecx
; _y$ = eax
; _w$ = esi
; Line 12
sub ecx, eax
mov edx, 1000 ; 000003e8H
push edi
$LL4@foo:
; Line 10
mov edi, DWORD PTR [eax]
add DWORD PTR [ecx+eax], edi
; Line 11
test esi, esi
je SHORT $LN3@foo
; Line 12
mov DWORD PTR [eax], 0
$LN3@foo:
; Line 9
add eax, 4
dec edx
jne SHORT $LL4@foo
pop edi
; Line 15
ret 0
?foo@@YAXPAH0HH@Z ENDP ; foo
Скомпилировано как релизный проект, 32 бита под VS2010 Premium, Win7 x64.