この架空のヘッダーファイルを見てください。
template <class T>
class HungryHippo {
public:
void ingest(const T& object);
private:
...
}
さて、文字列への参照HungryHippo<string>
が必要になるのは理にかなっていますingest
-文字列のコピーは非常にコストがかかる可能性があります!しかし、HungryHippo<int>
それはあまり意味がありません。int
直接渡すことは非常に安価ですが(ほとんどのコンパイラーはレジスターでそれを行います)、への参照を渡すことint
は余分な不必要なレベルの間接参照です。これはすべて戻り値にも当てはまります。
コンパイラに「引数を変更するつもりはないので、何が良いと思うかに応じて、値で渡すか参照で渡すかを決定する」ことを提案する方法はありますか?
関連する可能性のあるいくつかの事柄:
- を書い
template <class T, bool PassByValue> class HungryHippo
てからに特化することで、この効果を手動で偽造することができPassByValue
ます。本当に派手になりたいのなら、とに基づいて推測することもできPassByValue
ます。いずれにせよ、実装がほとんど同じように見える場合、これは多くの余分な作業であり、コンパイラーは、値を渡すかどうかを決定する上で、私よりもはるかに優れた仕事をすることができると思います。sizeof(T)
std::is_trivially_copyable<T>
libc ++プロジェクトは、コンパイラーが1レベル上の選択を行えるように多くの関数をインライン化することでこれを解決しているようですが、この場合、の実装コメントで説明されているように、すべてのテンプレート関数はingest
はかなり複雑で、インライン化する価値がないとしましょう。inline
デフォルトです。