“ const”需要付出代价吗?

| 编译器有时可能会利用某些“变量”是用于优化的常量这一事实,因此,通常可以使用“ const”关键字,但这是一个好主意,但是有一个折衷方案吗? 简而言之,是否存在使用\“ const \”可能会使代码变慢(甚至一点点)的情况?     
已邀请:
        
const
关键字仅在编译时使用。编译代码后,变量只是内存中的地址,没有任何特殊保护。 但是存在一些区别-全局
const
变量将放置在
text
段中,而不是
data
(如果已初始化)或bss(如果未初始化)。如果对“ 2”段的处理不同,例如从NOR闪存(而不是RAM)就地执行,则可能会有所不同。局部“ 0”变量与常规变量一起放在堆栈中,因此应该没有区别。 就像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和non-const全局变量之间的巨大差异):   变量:0x002af444   常量变量:0x002af440   参数:0x002af43c   全局常量:0x00a02104   全局非常量:0x00a03018     
        \“ const \”和\“ non-const \”对象的组合会以一种相当意外的方式严重伤害您。一些伪代码:
//in some file far far away...
SomeType firstVariable;
const SomeType secondVariable;
在这里,这些变量看起来像位于相邻地址。 在许多体系结构上,它们将相互远离,因为\“ const \”变量将放置在运行时具有写保护的特殊段中。因此,对这些变量的交错访问将导致错过更多的cheche错误,这可能会大大降低程序运行速度。     
        您可以想象一种体系结构,其中在程序执行期间存在不可写的内存,并且访问该内存的速度比访问“普通”内存的速度要慢(例如,由于每次访问期间都要进行额外的检查)。这几乎是不可能的-在大多数情况下,“ const”将至少与“ non-const”一样快。     
        在这种情况下以及其他情况下,优化器总是有可能以各种有趣的方式失败。例如,最近当GCC优化器用机器指令替换memcmp调用时,我遇到了一个问题。本来应该更快,但是在64位体系结构上,该指令似乎已被仿真,并且它比memcmp中显式编码的循环要慢。     

要回复问题请先登录注册