在循环内或循环外声明变量,有很大区别吗?
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();
}
例如
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();
}