Я пытаюсь установить, поддерживает ли Visual C ++ 2008 или 2010 оптимизацию компилятора с отключением цикла. Я знаю, что gcc это поддерживает.

0
hippietrail 26 Авг 2011 в 22:09

2 ответа

Лучший ответ

AFAIK, «Нет»:

http://cboard.cprogramming.com/c-programming/126756-lack-compiler-loop-optimization-loop-unswitching.html

Ваш пробег может отличаться в зависимости от:

  • Независимо от того, установлена ​​ли у вас последняя версия компилятора (MSVS 2010)

  • Независимо от того, приобрели ли вы MSVS Professional или выше

1
paulsm4 26 Авг 2011 в 18:16

Поэтому я просто попробовал это с 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.

1
Voo 27 Авг 2011 в 15:55