18

スマート ポインター、特に boost::shared_ptr を使用すると、時間とメモリの点でベア ポインターと比較してどのくらいコストがかかりますか? ゲーム/組み込みシステムのパフォーマンスを重視する部分では、ベア ポインターを使用する方が良いですか? パフォーマンスを重視するコンポーネントには、ベア ポインターとスマート ポインターのどちらを使用することをお勧めしますか?

4

6 に答える 6

21

スマート ポインターの逆参照は、通常、リリース モードでブーストする場合は簡単です。すべてのブースト チェックはコンパイル時に行われます。(スマート ポインターは、理論的にはスレッド間でスマートなことを行うことができます)。これにより、他の多くの操作が残ります。Nicola は、構築、コピー、および破壊について言及しました。ただし、これは完全なセットではありません。その他の重要な操作は、スワッピング、割り当て、および NULL へのリセットです。基本的に、スマートさが必要な操作。

これらの操作の一部は、一部のスマート ポインターによって除外されることに注意してください。たとえばboost::scoped_ptr、割り当てるどころか、コピーすることさえできません。これにより操作が少なくなるため、これらの少ないメソッドに対して実装を最適化できます。

実際、TR1 が登場すると、コンパイラは未加工のポインターよりもスマート ポインターを使用したほうがうまくいく可能性が非常に高くなります。たとえば、ある状況では、単にコピーできないという理由だけで、コピー不可のスマート ポインターがエイリアス化されていないことをコンパイラが証明できる可能性があります。考えてみてください。エイリアシングは、同じオブジェクトを指す 2 つのポインターが作成されたときに発生します。最初のポインターをコピーできない場合、2 番目のポインターはどのようにして同じオブジェクトを指すことになるのでしょうか? (それを回避する方法もあります- operator* は左辺値を返す必要があります)

于 2008-11-21T12:54:12.020 に答える
7

Boost は、さまざまなスマート ポインターを提供します。一般に、スマート ポインターの種類によって異なるメモリ占有量とパフォーマンスの両方が問題になることはありません。パフォーマンスの比較については、このhttp://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smarttests.htmを確認できます。

構造のみを確認できるように、パフォーマンスの比較ではコピーと破棄が考慮されます。つまり、スマート ポインターの逆参照には、生のポインターと同じコストがかかると考えられます。

shared_ptr<>次のスニペットは、生のポインターの代わりに inを使用してもパフォーマンスが低下しないことを示しています。

#include <iostream>
#include <tr1/memory>

int main()
{
#ifdef USE_SHARED_PTR
    std::tr1::shared_ptr<volatile int> i(new int(1));
#else
    volatile int * i = new int(1);
#endif

    long long int h = 0;

    for(long long int j=0;j < 10000000000LL; j++)
    {
        h += *i;
    }

    std::cout << h << std::endl;
    return 0;
}
于 2008-11-21T11:38:02.330 に答える
6

パフォーマンスの問題に対処する唯一の方法は、コードをプロファイリングすることです。とにかく、パフォーマンスの問題の大部分は想像されます。プロファイリングのみが、ボトルネックがどこにあるのかを指摘します。

スマート ポインターを使用すると、生のポインターでは発生しないボトルネックが発生することが判明した場合は、生のポインターを使用してください。それまでは、あまり心配しません。スマート ポインターのほとんどの操作はかなり高速です。文字列を比較する頻度が高すぎる可能性があります (またはそのようなもの)。

于 2008-11-26T18:17:23.783 に答える
2

std::vector<T*>「手動で」管理される(つまり、生のポインター) と、クラス std::vector<boost::shared_ptr<T> >の形式の との間に、見落とされがちな中間点があります。boost::ptr_container

これらは、生のポインター コンテナーのパフォーマンスとスマート ポインターのコンテナーの利便性を兼ね備えています (つまり、STL コンテナーが提供することを望む機能を提供しますstd::auto_ptr) 。

于 2009-03-19T14:01:27.710 に答える
2

私が最後に VC6 でテストしたとき、コンパイラはスマート ポインターを使用してコードを最適化することができず、生のポインターを使用して最適化することもできませんでした。それ以来、状況は変わっている可能性があります。

于 2008-11-21T15:02:54.570 に答える
2

参照カウント スマート ポインター (最も一般的な型) は、コピー、作成、および削除する場合にのみコストがかかります。それらのほとんどはスレッドセーフであるため、大量にコピーする場合、この追加コストは相当なものになる可能性があります。

「自動削除」ポインターだけが必要な場合は、非常に悪意のある auto_ptr、または C++0x の新しくて光沢のある (ただし、まだあまりサポートされていない) unique_ptr があります。

于 2008-11-21T14:32:01.450 に答える