2011-08-26 57 views

回答

1

據我所知, 「否」:

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

可能會因人而異,取決於:

  • 無論你是否有最新的編譯器(2010 MSVS)

  • 是否已購買MSVS Professional或更高版本

+1

AFAIK可用的編譯器優化不依賴於您購買的MSVC版本。他們將更多IDE功能添加到更昂貴的版本中。 – Praetorian

+0

我只有免費的Express版本,並認爲與pricier版本的差異將是喜歡IDE的東西而不是編譯器本身。但@ paulsm4:[似乎是正確的!](http://msdn.microsoft.com/en-us/library/aa271022(VS.60).aspx) – hippietrail

+1

@hippietrail:請注意,您已鏈接的頁面適用到VC++ 6.0(大約1998年的編譯器)。 –

1

所以我只是用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 [email protected]@[email protected]    ; foo 
; Function compile flags: /Ogtp 
; COMDAT [email protected]@[email protected] 
_TEXT SEGMENT 
[email protected]@[email protected] PROC     ; foo, COMDAT 
; _x$ = ecx 
; _y$ = eax 
; _w$ = esi 
; Line 12 
    sub ecx, eax 
    mov edx, 1000    ; 000003e8H 
    push edi 
[email protected]: 
; Line 10 
    mov edi, DWORD PTR [eax] 
    add DWORD PTR [ecx+eax], edi 
; Line 11 
    test esi, esi 
    je SHORT [email protected] 
; Line 12 
    mov DWORD PTR [eax], 0 
[email protected]: 
; Line 9 
    add eax, 4 
    dec edx 
    jne SHORT [email protected] 
    pop edi 
; Line 15 
    ret 0 
[email protected]@[email protected] ENDP     ; foo 

編譯爲發佈項目,32位下VS2010 Premium,W​​in7 x64。

+0

看起來它沒有這樣做,但我在裝配時很生疏,從來沒有像英特爾組裝那麼好。 – hippietrail

+1

對不起,我忘了分析彙編 - 討論移情;)但是,我們有一個循環(總是測試內部的W)。它實際上是'push edi'和'pop edi'之間的代碼,'test esi,esi'是我們測試w爲0的部分(如果跳過下一個mov指令)。 – Voo

+0

請注意,由於根據實際版本討論了不同的優化:這是在VS2010 Premium上運行的。 – Voo