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は、コンパイラは(1)の間にレジスタに値を保存し、myA.m_num(2)の間にそれを再び使用することはできません。の値を変更する必要はありませんが、DoSomethingConst内部への非定数ポインタがあるため、値は変更される可能性があり、そのため、の間に変更される可能性があります。この場合、への非定数参照があることを証明するのは簡単ですが、一般的な場合はそうではありません。 constmyA.m_nummyAmyBmyA.m_nummyA.DoSomethingConstmyA

于 2011-09-14T19:30:22.660 に答える
1

ここでいう「レジスタ キャッシュ」とは、コンパイラが値をレジスタに格納することを意味します。

メンバー関数を呼び出してconstも、メンバー変数の値は変更されません。そのため、メンバー変数の一部がレジスタに格納されている場合、それらの値は関数が返されたときにも有効です。

それほど重要な最適化ではないと思います。

于 2011-09-14T19:17:17.420 に答える