我见过一些这样的方法:
void SomeClass::someMethod() const;
这个 const 声明有什么作用,它如何帮助优化程序?
编辑
我看到这个问题的第一部分之前已经被问过......但是,它仍然没有回答第二部分:这将如何优化程序?
我见过一些这样的方法:
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”表示实例的状态没有改变,编译器可能有更多的自由来重新排序对该实例上的方法的附近调用。