20

我见过一些这样的方法:

void SomeClass::someMethod() const;

这个 const 声明有什么作用,它如何帮助优化程序?

编辑

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

4

6 回答 6

22

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

在 const_cast 的讨论中,这有点像 C++ 中的常见问题解答。

于 2009-05-01T04:53:18.783 回答
5

它告诉编译器该方法对类状态没有影响;你不能分配给它里面的任何东西。查看C++ FAQ Lite 18.10

于 2009-05-01T03:43:32.103 回答
4

无论 const 是否存在,为 const 方法生成的 asm 代码都是相同的。const 是编译器的函数而不是运行时,因此如果有任何性能提升,我认为编译器优化器可能会使用 const 作为内联或确定可能优化的副作用之类的提示。所以简而言之,优化器可能会有所帮助,但如果该方法是直接开始的,那么我怀疑从优化器生成的代码将是任何不同的 const 或没有 const。

这是我使用的一个简单的优化(而不是像 const 这样的事情),它需要一秒钟但得到回报。组织你的类变量,使它们更好地落在缓存行边界上,并将你最常访问的变量放在一起。为此,只需将整数、双精度、浮点数等放在类变量声明的顶部,并将奇数大小的变量放在底部,如下所示:

int foo; 
int bar;
double baz;
SomeObject obj;
char ch[14];
于 2009-05-01T04:47:32.730 回答
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对象的函数,但这两个非常罕见。

于 2009-05-01T03:45:02.270 回答
1

它可以防止 someMethod 更改该类对象的任何成员变量。

于 2009-05-01T03:43:15.427 回答
0

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

于 2009-05-01T04:45:57.350 回答