我见过这样的方法:

void SomeClass::someMethod() const;

这个const声明做了什么,它如何帮助优化程序?

修改

我看到这个问题的第一部分之前已被问过...... 但是,它仍然没有回答第二部分:这将如何优化程序?

有帮助吗?

解决方案

如果编译器知道类实例的字段未在const成员函数调用中被修改,则它不必重新加载在const函数调用之前它可能保留在寄存器中的任何字段。

这是在讨论const_cast

其他提示

它告诉编译器该方法对类状态没有影响;你不能分配任何东西。请查看 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易失性对象,但这两者非常罕见。

它阻止someMethod改变该类对象的任何成员变量。

我对优化的第一个想法是,由于'const'表示实例的状态没有改变,编译器可能在重新排序附近对该实例上的方法的调用方面有更多的自由。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top