我见过这样的方法:
void SomeClass::someMethod() const;
这个const声明做了什么,它如何帮助优化程序?
修改
我看到这个问题的第一部分之前已被问过...... 但是,它仍然没有回答第二部分:这将如何优化程序?
答案 0 :(得分:19)
如果编译器知道类实例的字段未在const成员函数调用中被修改,则它不必重新加载在const函数调用之前它可能保留在寄存器中的任何字段。
这类似于discussion on const_cast中的C ++常见问题解答。
答案 1 :(得分:5)
它告诉编译器该方法对类状态没有影响;你不能分配任何东西。看看C++ FAQ Lite 18.10。
答案 2 :(得分:4)
如果const存在与否,为const方法生成的asm代码将是相同的。 const是编译器而不是运行时的函数,因此如果有任何性能提升,我认为编译器优化器可能会使用const作为内联或确定可能优化的副作用等提示。所以简而言之,优化器可能会有所帮助,但如果方法是直接开始的,那么我怀疑从优化器生成的代码将是任何不同的const或没有const。
这是我使用的一个简单的优化(而不是点击和错过像const这样的东西)需要一秒钟才能获得回报。组织您的类变量,使它们更好地落在缓存行边界上,并将最常访问的变量放在一起。要做到这一点,只需将您的整数,双精度数,浮点数等放在类变量声明的顶部和底部的奇数大小的变量中,如下所示:
int foo;
int bar;
double baz;
SomeObject obj;
char ch[14];
答案 3 :(得分:2)
它允许您在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
个对象,但这两个非常罕见。
答案 4 :(得分:1)
它阻止someMethod改变该类对象的任何成员变量。
答案 5 :(得分:0)
我对优化的第一个想法是,由于'const'表示实例的状态没有改变,编译器可能在重新排序附近对该实例上的方法的调用方面有更多的自由。