什么更快?

Vai*_*orn 6 c++

如果我们在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)

  • 呃...我希望你按下"添加评论"按钮后编辑了这篇文章.(提示; variant_a和variant_b是相同的吗?) (3认同)
  • 你的两个函数a和b是相同的,它们不应该不同吗? (3认同)

Nic*_*ore 11

int声明是编译器的信息,不会转换为必须编码的指令.所以没有区别.在循环内声明int不会使循环向下倾斜.为什么不尝试为自己编译两者并让编译器输出汇编代码,以便您自己查看.