覚書。
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