次の C++ 関数があるとします。
// Returns a set containing {1!, 2!, ..., n!}.
set<int> GetFactorials(int n) {
set<int> ret;
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
ret.insert(curr);
}
return ret;
}
set<int> fs = GetFactorials(5);
(これはダミーの例です。重要なのは、関数がセット自体を作成し、それを返すことです。)
私の友人の 1 人は、私が行ったように関数を書く代わりに、戻り時にセットをコピーするのを避けるために、関数がセットへのポインターを受け取るように書くべきだと言っています。彼は次のような意味だったと思います:
void GetFactorials2(int n, set<int>* fs) {
int curr = 1;
for (int i = 1; i < n; i++) {
curr *= i;
fs->insert(curr);
}
}
set<int> fs;
GetFactorials2(5, &fs);
私の質問: この 2 番目の方法は本当に大きな利点ですか? 私にはかなり奇妙に思えます。私は C++ を初めて使用し、コンパイラについてはあまり知りませんが、コンパイラの魔法を使えば、元の関数はそれほど高価にはならないと思います。(そして、自分でセットを初期化する必要がなくなります。)間違っていますか?これを理解するには、ポインタとコピー オン リターンについて何を知っておくべきですか?