什么是寄存器缓存,它与const变量有什么关系



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

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

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

我想大概是这样的:

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内部,编译器不能在(1)期间将myA.m_num的值保存在寄存器中,并在(2)期间再次使用它。即使DoSomethingConstconst,因此不应该改变myA.m_num的值,但由于myB内部有一个指向myA的非const指针,因此myA.m_nummyA.DoSomethingConst期间仍然可以改变值。在这种情况下,证明存在对myA的非const引用是微不足道的,在一般情况下它不是。

这里的"寄存器缓存"是指让编译器将值存储在寄存器中。

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

相关内容

  • 没有找到相关文章

最新更新