2011-01-12 3 views
0

このコードはC++で正しいですか?C++の関数で値を返す

list<int> makelist(int litem) 
{ 
    list<int> newList; 
    newList.push_front(litem); 
    return newList; 
} 

リスト(#include <list>)を値で返すのは問題になるでしょうか?

+8

http://en.wikipedia.org/wiki/Return_value_optimization –

+0

これは問題ありません。問題は、離れたローカルオブジェクトへのポインタまたは参照を返すことです。これはリストをコピーするか、少なくとも持っているかのように動作します – jcoder

+1

あなたの 'list'タイプがわからないときにこれが正しいかどうかをどのように知ることができますか? – sbi

答えて

1

: は、私は以下のコードをお勧めしたいです。スピードが懸念される場合(プロファイラによって証明されるまで)、心配する必要はありません。一方、リストにコピーするときにいくつかの奇妙な副作用がある場合は、コピーコンストラクタの呼び出しの数を認識する必要がありますコンパイラと設定によって異なります。

1

これはうまくいくが、大量のメモリがコピーされる可能性があるので効率的ではない。次のC++標準では、この問題を解決することができます。 (オン最適化を実行している場合)は、通常、離れて最適化された値で返す、コメントとして

void fillList(list & lst) { 
    lst.push_front(...); 
} 
.... 
list newList; 
fillList(newList); 
+0

それは非効率的ですか?私の知る限りでは、C++オプティマイザはそれを気にし、メモリコピーをしません!ああ、私は正しいと思う、上記の@ nice_blonde_stupid_girlのコメントを読んでください。 – Rafid

+4

私はあなたがこれをしないことをお勧めします。おそらく戻り値の最適化がこれを処理し、そうでない場合でも、そのような最適化は時期尚早に適用されるのではなく、必要なときに予約する必要があります。 – sbi

-1

あなたは単にタイプ(int型、float型、char型)でないローカルオブジェクトを返すことはできませんが、新しいオブジェクトへのポインタを返すことができます世話を

list<int>* makelist(int litem) 
{ 
    list<int>* newList = new list<int>(); 
    newList->push_front(litem); 
    return newList; 
} 

その次の操作が必要メモリリークを避けるために後者のポインタを管理します。

+1

これは間違っています。コピーごとに返すことができないタイプは、コピーを防止するタイプだけです。 – sbi

+0

申し訳ありませんが、C++はローカルオブジェクトを何らかの形でコピー可能である限り、値で返しても問題ありません。ポインターは必要ありません。この答えは単に間違っています。 – daramarak