C++ g++;不正确的循环?

C++ g++;不正确的循环?,c++,g++,disassembly,C++,G++,Disassembly,我有一个与此类似的实际程序,我将其称为test.cpp: #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); } } 我得到以下装配顺序: .file "test.cpp"

我有一个与此类似的实际程序,我将其称为
test.cpp

#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);   
     }
}
我得到以下装配顺序:

        .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
,以及循环中的条件跳转。这是怎么回事


< Ubuntu Linux > /P> < P> C++ >代码> SIEZHET未签名,因此条件<代码> I>=0 总是“代码>真< /代码>。
i
不可能是负数。

太棒了!因此,正在对比较进行优化!谢谢。这是否意味着由于整数类型的环绕,上述循环是一个无限循环?@JonasWielicki:是的。除非
f
抛出或以其他方式导致控件不返回到
sample
,否则循环将迭代直到线程终止。实际的替代方法是
i!=std::numeric_limits::max()
,这将在下溢时中断循环。或者如果可能,为
i
签名。+1是!编译器抑制了示例从未退出的事实!当我将I改为int时,编译器随后抱怨sample没有返回int。太棒了!你能澄清一下“变得消极”吗?请注意,“size\u t”永远不能为负,因此当i>=0始终为真时,您将遇到一个inifite循环。事实上,这是一个无限循环,因为我将换行到所有1,然后再换行到0,依此类推。。。问题是为什么汇编中没有测试,答案是它正在优化,即使编译器没有要求优化。
        .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