Я пытаюсь установить, поддерживает ли Visual C ++ 2008 или 2010 оптимизацию компилятора с отключением цикла. Я знаю, что gcc это поддерживает.
2 ответа
AFAIK, «Нет»:
Ваш пробег может отличаться в зависимости от:
Независимо от того, установлена ли у вас последняя версия компилятора (MSVS 2010)
Независимо от того, приобрели ли вы MSVS Professional или выше
Поэтому я просто попробовал это с 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
Скомпилирован как проект Release, 32-битный под VS2010 Premium, Win7 x64.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.