Visual C ++ поддерживает переключение циклов? - PullRequest
0 голосов
/ 26 августа 2011

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

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Так что я только что попробовал это с 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.

1 голос
/ 26 августа 2011

AFAIK, "Нет":

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...