编译器有时会利用某些“变量”是优化的常量这一事实,所以在可能的情况下使用“const”关键字通常是一个好主意,但是有权衡吗?
简而言之,是否存在使用“const”实际上会使代码变慢(甚至一点点)的情况?
答案 0 :(得分:8)
const
关键字仅在编译时使用。编译代码后,变量只是内存中的一个地址,没有任何特殊保护。
但是有一些区别 - 全局 const
变量将放在text
段中,而不是data
(如果已初始化)或{{ 3}}(如果未初始化)。如果对text
段的处理方式不同,例如从NOR闪存(而不是RAM)执行,则可能存在差异。 本地 const
变量与常规变量一起放在堆栈中,因此应该没有区别。
除此之外,正如bestsss所说,如果变量是常量,则可能无法进行一些编译时优化。我无法想到任何事情(尤其不是纯粹的C),但从理论上讲它是可行的。
编辑:
以下代码演示了第二段中的要点:
const int g = 1;
int not_const = 1;
void foo(int param)
{
int i = 1;
const int j = 1;
printf("Variable: \t\t0x%08x\n", (int)&i);
printf("Const varialbe: \t0x%08x\n", (int)&j);
printf("Parameter: \t\t0x%08x\n", (int)¶m);
printf("Global const: \t\t0x%08x\n", (int)&g);
printf("Global non-const: \t0x%08x\n", (int)¬_const);
}
在Visual Studio 2010中,结果如下(注意const和非const全局之间的巨大差异):
变量:0x002af444
Const varialbe:0x002af440
参数:0x002af43c
全局const:0x00a02104
全局非常量:0x00a03018
答案 1 :(得分:4)
“const”和“non-const”对象的组合会以一种意想不到的方式严重伤害你。一些伪代码:
//in some file far far away...
SomeType firstVariable;
const SomeType secondVariable;
这些变量看起来像是在相邻的地址。
在许多体系结构中,它们将彼此远离,因为“const”变量将被放置在运行时具有写保护的特殊段中。因此,对这些变量的交错访问将导致比您预期的更多的错误,这可能会大大减慢您的程序。
答案 2 :(得分:2)
你可以想象一个架构,其中存储器在程序执行期间是不可写的和访问该存储器比访问“通常”存储器更慢(例如,因为在每次访问期间进行额外检查)。这是极不可能的 - 在大多数情况下,“const”的工作速度至少与“非const”一样快。
答案 3 :(得分:1)
优化器总是可能以各种有趣的方式失败,在这种情况下和其他方式。例如,当GCC优化器用机器指令替换memcmp调用时,我最近遇到了问题。这应该更快,但在64位架构上,似乎这个指令被模拟,结果比memcmp中的显式编码循环慢。