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