在循环内或循环外声明变量,有很大区别吗?

declare variable inside or outside a loop, does it make big difference?

例如

int i, a, c, d; // these vars will only be used in while
while(bigNumber--) {
    i = doSomething();
    // **

}

while(bigNumber--) {
   int i, a, b, c; // i'd like to put it here for readability
   i = doSomething();
   // **
}

它在性能方面有很大的不同吗?

是的。两种情况下变量 i 的范围都不同。

在第一种情况下,我在块或函数中声明了一个变量。因此,您可以在块或函数中访问它。

第二种情况,我在while循环中声明了一个变量。因此,您只能在 while 循环中访问它。

Does it make big difference in terms of performance?

,在何处声明它对性能没有影响。

对于示例 1:

int main()
{
    int i, bigNumber;

    while(bigNumber--) {
        i = 0;
    }
}

程序集:

main:
  push rbp
  mov rbp, rsp
.L3:
  mov eax, DWORD PTR [rbp-4]
  lea edx, [rax-1]
  mov DWORD PTR [rbp-4], edx
  test eax, eax
  setne al
  test al, al
  je .L2
  mov DWORD PTR [rbp-8], 0
  jmp .L3
.L2:
  mov eax, 0
  pop rbp
  ret

示例 2:

int main()
{
    int bigNumber;

    while(bigNumber--) {
        int i;
        i = 0;
    }
}

程序集:

main:
  push rbp
  mov rbp, rsp
.L3:
  mov eax, DWORD PTR [rbp-4]
  lea edx, [rax-1]
  mov DWORD PTR [rbp-4], edx
  test eax, eax
  setne al
  test al, al
  je .L2
  mov DWORD PTR [rbp-8], 0
  jmp .L3
.L2:
  mov eax, 0
  pop rbp
  ret

两者生成相同的汇编代码。

这是不同的...当你在循环外声明一个变量时,你可以在循环结束后得到它的值,但如果你在循环内声明它,你不能在循环后使用它,因为它不是定义

问。它在性能方面有很大的不同吗?

A. 完全没有性能差异。唯一的区别是变量的范围在循环外是否可见。

Computational complexity 和 I/O 操作是最有价值的东西,您必须将其视为程序中的性能瓶颈。这两个代码之间没有性能差异。此外,编译器对代码进行了一些优化,如果这两个代码 运行 相同(即编译器自动将第二个代码转换为第一个代码),这并不意外。

我在汇编结果中看到的唯一区别是 movl [=10=], -4(%rbp) 指令的位置。理论上,可能 对使用在内存中分布更广泛的数据的代码造成性能损失(这将使您的代码在理论上对缓存不那么友好)

实际上不会有任何区别。缓存足够大,优化将使两个代码生成相同的程序集,并且很可能代码会重新排序。以下是一个简单的测试用例,所有优化都关闭和打开。

组装结果:

代码:

打开优化器 将生成完全相同的结果:

我想如果你这样说,它会不断地重新声明变量,所以无论你初始化什么,它都会在变量重新声明自己之后丢失。

while(bigNumber--) {
   int i, a, b, c; 
   i = doSomething();
}