“const”有成本吗?

时间:2011-06-01 05:38:10

标签: c performance optimization const

编译器有时会利用某些“变量”是优化的常量这一事实,所以在可能的情况下使用“const”关键字通常是一个好主意,但是有权衡吗?

简而言之,是否存在使用“const”实际上会使代码变慢(甚至一点点)的情况?

4 个答案:

答案 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)&param);
    printf("Global const: \t\t0x%08x\n", (int)&g);
    printf("Global non-const: \t0x%08x\n", (int)&not_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中的显式编码循环慢。