如何解决“ 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)¶m);
printf(\"Global const: \\t\\t0x%08x\\n\",(int)&g);
printf(\"Global non-const: \\t0x%08x\\n\",(int)¬_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中显式编码的循环要慢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。