Что такое кэш регистров и как он связан с константными переменными? - PullRequest
2 голосов
/ 14 сентября 2011

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

Даже если язык запрещен const_cast, единственный способ избежать очистки кэша регистров при вызове функции-члена const состоит в решении проблемы псевдонимов (то есть, чтобы доказать, что нет не const указателей, которые указывают на объект).

Что такое кэш регистров, что означает очистить его через const вызов функции-члена?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Я думаю, что речь идет о чем-то вроде этого:

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).Даже если DoSomethingConst равно const и поэтому не должно изменять значение myA.m_num, значение все равно можно изменить, поскольку внутри myB имеется неконстантный указатель на myA, поэтому myA.m_num можетвсе еще меняется в течение myA.DoSomethingConst.В этом случае нетрудно доказать, что существует неконстантная ссылка на myA, в общем случае это не так.

1 голос
/ 14 сентября 2011

Здесь «кэш регистров» означает, что компилятор хранит значения в регистрах.

Вызов функции-члена const не должен изменять значения каких-либо переменных-членов, поэтому, если некоторые из них сохраняются в регистрах, эти значения будут по-прежнему действительными, когда функция вернется.

Не очень важная оптимизация, я думаю.

...