覚書。

this-> の意味    テンプレート継承で名前解決のため。速度的にはローカル化推奨
 

3. this-> はなぜ使うの? 継承との関係は?
継承先で使っている this->member は、テンプレート + 継承の組み合わせで必要になる場面があります。

template<typename T>
class Base {
protected:
    T mVector[10];
};

template<typename T>
class Derived : public Base<T> {
public:
    T& operator()(size_t i) {
        return this->mVector[i]; // this-> が必要
    }
};

これは「Base<T>::mVector がテンプレートによって名前解決が遅延されている」ため、this-> で明示しないとコンパイルできないことがあるんです。
速度についての補足:
    this->mVector[i] は実際には *(this + offset) 的なアクセスになる。
    対して、T* p = this->mVector; → p[i] にすると、レジスタに乗る確率がグッと上がる。
つまり:
auto& vec = this->mVector;
for (...) {
    do_something(vec[i]); // 高速になることが多い
}

 

auto& vec = this->mVector; はディープコピーか?
いい着眼点です!
 答え:NO、 これはディープコピー ではない!
auto& vec = this->mVector;
これは「参照(reference)を束ねてるだけ」です。
つまり vec[i] はそのまま this->mVector[i] と同じメモリを見ていることになります。
したがって:
inline T& operator()(const size_t& c) noexcept {
    return this->mVector[c];  // <- これは妥当
}
これ自体も 1回のアクセスごとに this-> のオフセット参照が発生するだけで、それほど重くないです。 でも、頻繁に呼ばれる場合は、この mVector を関数内で参照にキャッシュしたほうが速くなるケースもあります。
 結論(速度重視まとめ)
状況    おすすめ書き方    備考
単発呼び出し    this->mVector[c]    問題なし
高頻度アクセス    auto& vec = this->mVector; → vec[c]    レジスタ化・オフセット計算の省略効果あり
operator() 内部で使う    無理に最適化しなくてOK    ただし中で複数回アクセスするなら auto& 化あり

 

この変換はキャッシュヒット率&レジスタ最適化の観点で効果があります。

 

引用 ChatGPT