如果我们在c ++中有以下2个代码片段来执行相同的任务:
int a, b=somenumber;
while(b > 0)
{
a = b % 3;
b /= 3;
}
Run Code Online (Sandbox Code Playgroud)
要么
int b=somenumber;
while(b > 0)
{
int a=b%3;
b /= 3;
}
Run Code Online (Sandbox Code Playgroud)
我对计算机体系结构/ c ++设计了解不多,但我认为第一个代码更快,因为它在开始时声明了整数a并且只在while循环中使用它,而在第二个代码中,整数a是每次while循环重新开始时都被声明.有人可以帮我这个,我是正确的还是为什么?为什么?
Jak*_*org 14
应该没有区别,但是要进行额外的经验(肛门?)我用g ++测试了它,为每个代码片段创建一个函数.无论有无优化,无论声明在何处,它都会生成相同的代码int a.
#include <iostream>
int variant_a(int b)
{
int a;
while(b > 0)
{
a = b % 3;
b /= 3;
}
return b;
}
int variant_b(int b)
{
while(b > 0)
{
int a = b % 3;
b /= 3;
}
return b;
}
int main()
{
std::cout << variant_a(42) << std::endl;
std::cout << variant_b(42) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是未经优化的循环:
_Z9variant_ai:
.LFB952:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $24, %esp
.LCFI2:
jmp .L2
.L3:
movl 8(%ebp), %eax
movl %eax, -20(%ebp)
movl $1431655766, -24(%ebp)
movl -24(%ebp), %eax
imull -20(%ebp)
movl %edx, %ecx
movl -20(%ebp), %eax
sarl $31, %eax
subl %eax, %ecx
movl %ecx, %eax
addl %eax, %eax
addl %ecx, %eax
movl -20(%ebp), %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, -4(%ebp)
movl 8(%ebp), %eax
movl %eax, -20(%ebp)
movl $1431655766, -24(%ebp)
movl -24(%ebp), %eax
imull -20(%ebp)
movl %edx, %ecx
movl -20(%ebp), %eax
sarl $31, %eax
movl %ecx, %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, 8(%ebp)
.L2:
cmpl $0, 8(%ebp)
jg .L3
movl 8(%ebp), %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
和优化的一个:
_Z9variant_ai:
.LFB968:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
pushl %ebx
.LCFI2:
movl 8(%ebp), %ebx
testl %ebx, %ebx
jle .L2
movl $1431655766, %ecx
.p2align 4,,7
.p2align 3
.L5:
movl %ebx, %eax
imull %ecx
movl %ebx, %eax
sarl $31, %eax
movl %edx, %ebx
subl %eax, %ebx
jne .L5
.L2:
movl %ebx, %eax
popl %ebx
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)