2017-02-20 5 views
0

私は以前のアプリケーションの状態(CTRL + Z/CTRL + Y)を復元するためにソフトウェアでのユーザの操作を追跡するクラスを設計しています。私は、公演に関して何かを明確にしたいと思っていました。ポインタや "普通のオブジェクト"を格納しているリスト

私はSTLのstd::listコンテナを使用しています。このリストには、本当に巨大なオブジェクトが含まれているわけではありませんが、かなりの数です。ポインタを使うべきかどうか?例えば

は、ここに格納されるオブジェクトの種類れる:

std::list<ImagesStatee*> stereoImages; 

:今のところ

struct ImagesState 
{ 
    cv::Mat first; 
    cv::Mat second; 
}; 

struct StatusBarState 
{ 
    std::string notification; 
    std::string algorithm; 
}; 

は、私のような、structポインタの形で全体を保存します私はnewdeleteの演算子に時間がかかることは知っていますが、私は "普通のオブジェクト"でスタックオーバーフローが発生したくないと思います。それは悪いデザインですか?

+1

ポインタは、一般的に多型を除いて必要ありません。値を格納します(オブジェクトインスタンスで、ポインタではありません)。 'std :: vector'は「デフォルトのコンテナ」であることに注意してください。 –

+1

これは、とにかくポインタを選択した場合、C++ 11で導入された新しいスマートポインタを使用するということです。 –

+0

@Someprogrammerdude 'スマートポインタ'は安全のためにはいです。 – Papipone

答えて

1

リストを使用している場合は、ポインタを使用しないことをお勧めします。リスト項目はヒープ上にあり、ポインタは不要なインダイレクション層を追加するだけです。

パフォーマンスの後であれば、std :: listを使用する方が最適な解決策ではない可能性があります。 std :: vectorを使用すると、オブジェクトがキャッシュに適しているため、パフォーマンスが大幅に向上する可能性があります。 ベクトルでさえも、オブジェクトはヒープ上にあるため、ポインタは必要ありません(リストを使用するよりもあなたを傷つけることさえあります)。あなたがスタックに配列を作る場合、それらについて気にする必要があります。そのような

Type arrayName[REALLY_HUGE_NUMBER] 
+0

'パフォーマンスの後で、std :: listを使用している場合は、わかっていますが、そのリストは挿入のパフォーマンスが優れていると聞いています。とにかく、私はもうオブジェクトを挿入する必要はありません。私はベクトルに行く。 – Papipone

+0

'リストアイテムはヒープ上にあり、ポインタは不要なインダイレクションレイヤを追加するだけです。ポインタを使用していない場合は、push_backまたは移動コンストラクタを使用してオブジェクトコンストラクタを呼び出しますか? – Papipone

+1

rvalueまたはlvalueがあるかどうかによって異なります。あなたが次のようなことをすれば: vector.push_back(ObjectType(param1、...、paramn)); 移動コンストラクタを呼び出す可能性が高いです。その呼び出しを保存したい場合は、 vector.emplace_back(param1、...、paramn)を呼び出すことができます。 これは、ベクトルにオブジェクトを構築します。その後のコピーや移動は必要ありません。 – OutOfBound

関連する問題