什么是寄存器缓存以及它与const变量有什么关系?

时间:2011-09-14 19:02:08

标签: c++ const compiler-optimization cpu-registers aliasing

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

  

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

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

2 个答案:

答案 0 :(得分: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内,编译器无法在(1)期间将myA.m_num的值保存在寄存器中,并在(2)期间再次使用它。即使DoSomethingConstconst,因此不应更改myA.m_num的值,但仍可以更改该值,因为myA内有一个非常量指针myB {1}} myA.m_num myA.DoSomethingConstmyA期间仍可能发生变化。在这种情况下,证明存在对{{1}}的非const引用是微不足道的,在一般情况下它不是。

答案 1 :(得分:1)

这里“寄存器高速缓存”表示编译器将值存储在寄存器中。

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

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