2012-06-29 109 views
2

我有一個現實世界的程序,它是類似這樣的,我會打電話給test.cppg ++不正確的循環?

#include <stdlib.h> 

extern void f(size_t i); 

int sample(size_t x) 
{ 
    size_t a = x; 
    size_t i; 

    for (i = a-2; i>=0; i--) { 
      f(i); 
    } 
} 

而我的問題是,我是一個無限循環。

如果我運行下面的命令:

g++ -S -o test.s test.cpp 

我得到以下組裝順序:

 .file "test.cpp" 
     .text 
     .globl _Z6samplem 
     .type _Z6samplem, @function 
_Z6samplem: 
.LFB0: 
     .cfi_startproc 
     pushq %rbp 
     .cfi_def_cfa_offset 16 
     .cfi_offset 6, -16 
     movq %rsp, %rbp 
     .cfi_def_cfa_register 6 
     subq $32, %rsp 
     movq %rdi, -24(%rbp) 
     movq -24(%rbp), %rax 
     movq %rax, -8(%rbp) 
     movq -8(%rbp), %rax 
     subq $2, %rax 
     movq %rax, -16(%rbp) 
.L2: 
     movq -16(%rbp), %rax 
     movq %rax, %rdi 
     call _Z1fm 
     subq $1, -16(%rbp) 
     jmp  .L2 
     .cfi_endproc 
.LFE0: 
     .size _Z6samplem, .-_Z6samplem 
     .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" 
     .section  .note.GNU-stack,"",@progbits 

我在彙編語言方面的專家,但我希望看到代碼,比較i >= 0和條件跳出循環。這裏發生了什麼??

GNU C++ 4.6.3在Ubuntu Linux

+0

你能否澄清「變得負面」?請注意,「size_t」永遠不會是負數,所以當i> = 0總是爲真時,您將遇到一個無限循環。 – niko

+0

事實上,這是一個無限循環,因爲我把所有的東西包裝到0,等等......這個問題爲什麼在程序集中沒有測試,並且答案是它被優化了,即使沒有要求優化來自編譯器。 – deStrangis

回答

11

size_t是無符號的,所以條件i>=0總是truei不可能爲負數。

+0

太棒了!所以比較正在被優化掉!謝謝。 – deStrangis

+0

這是否意味着由於整數類型的環繞,上述循環是無限循環? –

+2

@JonasWielicki:是的。除非'f'拋出或以其他方式控制不返回'sample',否則循環將迭代直到線程終止。 –