我见过一些这样的方法:
void SomeClass::someMethod() const;
这个 const 声明有什么作用?它如何帮助优化程序?
编辑
我看到这个问题的第一部分之前已经被问过... 但是,它仍然没有回答第二部分:这将如何优化程序?
如果编译器知道类实例的字段在 const 成员函数调用中不会被修改,则它不必重新加载在 const 函数调用之前可能保留在寄存器中的任何字段。
这有点参考了 const_cast 的讨论中的 C++ 常见问题解答。
它告诉编译器该方法对类状态没有影响;您不能分配给其中的任何内容。查看 C++ FAQ Lite 18.10。
无论const存在与否,为const方法生成的asm代码都是相同的。 const 是编译器的函数,而不是运行时的函数,因此,如果有任何性能提升,我认为编译器优化器可能会使用 const 作为内联或确定可能优化的副作用等操作的提示。因此,简而言之,优化器可能会有所帮助,但如果该方法一开始就很简单,那么我怀疑优化器生成的代码是否会是任何不同的 const 或没有 const。
这是我使用的一个简单的优化(而不是像 const 这样的碰碰运气的东西),它需要一秒钟,但会得到回报。组织您的类变量,使它们更好地落在缓存行边界上,并将最常访问的变量放在一起。为此,只需将整数、双精度数、浮点数等放在类变量声明的顶部,并将奇数大小的变量放在底部,如下所示:
int foo;
int bar;
double baz;
SomeObject obj;
char ch[14];
它允许您在
const
对象上调用类成员函数:
class SomeClass
{
public:
void foo();
void bar() const;
}
SomeClass a;
const SomeClass b;
a.foo(); // ok
a.bar(); // ok
b.foo(); // ERROR -- foo() is not const
b.bar(); // ok -- bar() is const
还有
volatile
限定符用于 volatile
对象,您还可以创建函数 const volatile
用于 const volatile
对象,但这两个非常罕见。
它可以防止 someMethod 更改该类的对象的任何成员变量。
我关于优化的第一个想法是,由于“const”表示实例的状态没有改变,因此编译器在重新排序对该实例上的方法的附近调用方面可能有更多的自由。