2011-08-26 154 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