2

来自http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.14

即使语言不合法const_cast,避免在const成员函数调用中刷新寄存器缓存的唯一方法是解决别名问题(即证明没有const指向对象的非指针)。

什么是寄存器缓存,在const成员函数调用中刷新它是什么意思?

4

2 回答 2

3

我认为它在谈论这样的事情:

class A;

class B {
public:
    A * m_a;
    B(A * a) : m_a(a) {}
}; 

Class A {
public:
    int m_num;
    A(int num=0) : m_num(num) {}
    void DoSomethingConst(B * someB) const;
};

void SomeOtherFunction()
{
   A myA;
   B myB(&myA);

   //do something with myA.m_num (1)
   myA.DoSomethingConst(&myB);
   //do something else with myA.m_num (2)
}

在 的内部SomeOtherFunction,编译器无法myA.m_num在 (1) 期间将 的值保存在寄存器中,并在 (2) 期间再次使用它。即使DoSomethingConstisconst并且因此不应该更改 的值myA.m_num,该值仍然可以更改,因为有一个指向myA内部的非常量指针myB,因此myA.m_num在 期间仍然可以更改myA.DoSomethingConst。在这种情况下,证明存在对 的非常量引用是微不足道的myA,在一般情况下它不是。

于 2011-09-14T19:30:22.660 回答
1

这里的“寄存器缓存”意味着让编译器将值存储在寄存器中。

调用const成员函数不应更改任何成员变量的值,因此如果其中一些存储在寄存器中,这些值在函数返回时仍然有效。

我猜这不是一个非常重要的优化。

于 2011-09-14T19:17:17.420 回答