にSTLリストの構文を挿入::インサートは以下の通りです -パラメータ::
iterator
insert(iterator __position, const value_type& __x);
代わりにイテレータへ参照のイテレータが渡されているのはなぜ?
にSTLリストの構文を挿入::インサートは以下の通りです -パラメータ::
iterator
insert(iterator __position, const value_type& __x);
代わりにイテレータへ参照のイテレータが渡されているのはなぜ?
実装では、イテレータを値ではなくconst参照で渡すことができます。関連する意味的な違いはありません。
この場合、値渡しはやや効率的です。 iterator
オブジェクトには、ヒープ上のリスト要素オブジェクトへの単一のポインタが含まれています。参照渡しは本質的にポインタの後ろを舞台に回ることを覚えておいてください。 (参照はではなく、ではなく、実際の関数呼び出しの境界を越えるときには他の実行可能な実装はありません。)したがって、値渡しはヒープへのポインタが渡されることを意味しますが、参照を渡すと、iterator
へのポインタが渡され、次にinsert
関数内で2つの間接が必要になります。 (これは、ABIに依存するが、いずれにしても値渡しする欠点があることができない理論的にはありません。)を通過セマンティクスの
迅速イラスト:
template< typename param >
void same_params(param a, param b) {
std::cout << (&a == &b) << '\n';
}
int main() {
int const five = 5;
same_params< int const & >(five, five); // true
same_params< int const & >(five, 6); // false
same_params< int const & >(five, 5); // unspecified
same_params< int const & >(5, 5); // unspecified
same_params<int>(five, five); // false (for any arguments)
}
はそれがwerenが」ポインタを渡すと、same_params< int const & >
が機能する方法はありません。
また、どうしてですか? –
反復子は、通常、参照ではなくC++で値渡しされます。しかし、このコンベンションがどこで起こったのか分かりません。 – templatetypedef
@KerrekSB私はこれを尋ねた理由は通常、一時的な(およびコンストラクタのコピーを避けるために)constへの参照が優先されるためです。しかしtemplatetypedefが言及しているように、これは慣習であり、Potatoswatterは以下のコメントでコンパイラが呼び出しを最適化していると説明しています。それとももっと何かありますか?ありがとう。 – nightlytrails