2011-12-21 6 views
0

SDL_Surfaceへのポインタを持つTextureというクラスがあります。私はそれをベクトルに追加したいとき、オリジナルが範囲外になったときに問題を防ぐために、デフォルト以外のコピーコンストラクタを用意する必要があります。コピーコンストラクタは、オブジェクトが値渡しで関数に渡されるたびに呼び出されることはわかっています。多くのテクスチャオブジェクトを値ごとにレンダリング関数に渡すと、すべてのフレームがスローダウンしますか?私はこの問題を避けるために参照渡すことができることを知っていますが、私は既存のコードを可能な限りそのままにしたいと思います。デフォルト以外のコピーコンストラクタはプログラムを遅くしますか?

+1

あなたはそれを測定して教えてください。 –

+0

明示的なコピーコンストラクタはどの程度激しいですか?パフォーマンスを管理するための最大の余地は、明示的なコピーコンストラクタを持つことです。デフォルトに関する魔法はありません。 – wallyk

+0

確かに、自分のコードを書く前に知りたいと思っていただけです。また、コピーコンストラクタを作成するときに、すべての変数またはポインタのみを初期化する必要があります。ポインタを使って作業すれば、残りは自動的にコピーされますか? – Alidaco

答えて

2

まず、パフォーマンスを本当に懸念している場合、デフォルトまたはカスタムコピーコンストラクタを使用する場合でも、値渡しの参照は非常に高価になる可能性があります。

値渡しとコピーコンストラクタを使って渡すことが完全に設定されていれば、デフォルトのコピーコンストラクタはすべてが世話をするのでいいと思います。可能であれば、クラスを継続して使用できるようにクラスを調整してください。

クラスにポインタがある場合、1つのアプローチは、それらをある種のスマートポインタの中にラップすることです。たとえば、SDL_Surface*の代わりにstd::shared_ptr<SDL_Surface>(またはboost::shared_ptr<SDL_Surface>が同じ)を使用すると、そのポインタをコピーすることができます。 shared_ptrクラスは参照カウントを保持し、すべての参照がなくなったときにのみサーフェスを削除します。この方法を行う場合は、this questionに示すように、SDL_Surfaceのカスタム削除関数を使用する必要があることに注意してください。

+0

ありがとうございました。私は参照渡しを開始し、スマートポインタを少し見てみましょう。 – Alidaco

関連する問題