在什么情况下可执行代码更快?
如果使用const,代码会更快,因为编译器有更多的优化空间。考虑一下这个 sn-p:
int c = 5;
[...]
int x = c + 5;
如果c 是常数,它将简单地将10 分配给x。如果c 不是常量,则取决于编译器是否能够从代码中推断出c 是事实上的常量。
编译器如何优化案例1中的可执行代码?
如果变量不是常数,编译器会更难优化代码。变量的范围越广,编译器就越难以确保变量没有变化。
对于简单的情况,例如局部变量,经过基本优化的编译器将能够推断出该变量是一个常量。所以它会把它当作一个常数来对待。
if (...) {
int c = 5;
[...]
int x = c + 5;
}
对于更广泛的范围,如全局变量、外部变量等,如果编译器无法分析整个范围,它会将其视为普通变量,即分配一些空间、生成加载和存储操作等。
file1.c
int c = 5;
file2.c
extern int c;
[...]
int x = c + 5;
有更积极的优化选项,例如链接时间优化,在这种情况下可能会有所帮助。但是,在性能方面,const 关键字仍然有帮助,尤其是对于具有广泛范围的变量。
编辑:
简单示例
文件 const.C:
const int c = 5;
volatile int x;
int main(int argc, char **argv)
{
x = c + 5;
}
编译:
$ g++ const.C -O3 -g
反汇编:
5 {
6 x = c + 5;
0x00000000004003e0 <+0>: movl $0xa,0x200c4a(%rip) # 0x601034 <x>
7 }
所以我们只需将 10 (0xa) 移动到 x。
文件 nonconst.C:
int c = 5;
volatile int x;
int main(int argc, char **argv)
{
x = c + 5;
}
编译:
$ g++ nonconst.C -O3 -g
反汇编:
5 {
6 x = c + 5;
0x00000000004003e0 <+0>: mov 0x200c4a(%rip),%eax # 0x601030 <c>
0x00000000004003e6 <+6>: add $0x5,%eax
0x00000000004003e9 <+9>: mov %eax,0x200c49(%rip) # 0x601038 <x>
7 }
我们加载c,添加5并存储到x。
所以你可以看到,即使有相当激进的优化(-O3)和你能写的最短的程序,const 的效果还是很明显的。
g++ 版本 5.4.1