C++uniqu_ptrとshared_ptr
C++の標準ライブラリにはunique_ptrとshared_ptrと同じようなスマートポインタがあります。 何が違うのか?どう使い分ければ良いのか?
と、気になりましたので少し調べてみました。
実行環境は、
- OS: Windows 8.1
- CPU: Core 2 Quad Q9550 2.83GHz
- ビルド: Visual Studio 2013のVCコンパイラ
以下のようなコードを、 最適化無しで 実行してみましたところ、
#include <iostream> #include <memory> #include <ctime> int main() { const int N = 100000000; std::shared_ptr<int> sptr(new int); std::unique_ptr<int> uptr(new int); clock_t s, e; s = clock(); for ( int i=0; i<N; i++ ) { int *p = sptr.get(); } e = clock(); std::cout << "clock=" << (e-s) << "[tick]" << std::endl; s = clock(); for ( int i=0; i<N; i++ ) { int *p = uptr.get(); } e = clock(); std::cout << "clock=" << (e-s) << "[tick]" << std::endl; return 0; }
shared_ptr型のgetは750[tick]、uniaue_ptr型のgetは453[tick]ほどで1.5倍ほどの差があります。
最適化無しでは 。 最適化すると、この程度の比較では両者の差は全く無くなります。 上のコード程度の単純な使い方であれば、使い分けることをあまり考えても良いのかもしれません。
厳密に性能面での差異を見つけるにはもっと別の面から比較する必要があるようです。