こんにちは。ヤマヤタケシです。ちょっとしたコードを書いて達成感を味わいたい今日このごろなので、書きましょう。
今日はたまたまスゴイ情報を手に入れました。
std::shared_ptrを使うと、operartor newが2回呼ばれるけど、std::make_sharedを使うと1回で済むらしい!
— yamaya takeshi (@toyman_jp) 2015, 5月 7
C++プログラマーよ!std::make_sharedを安易に使うべからず!で検証されていますが、後追いで実験してみましょう。
// std::make_sharedのテスト // 2015/5/08 yamaya takeshi #include <memory> #include <cstdlib> #include <iostream> void *operator new( size_t size) { void *p = std::malloc( size ); std::cout << "new " << p << " " << size << std::endl; return p; } void operator delete( void *p ) { std::cout << "delete" << p << std::endl; std::free( p ); } int main() { std::cout << "--use shared_ptr--" << std::endl; { std::shared_ptr<int> p1( new int(5) ); std::cout << *p1 << std::endl; } std::cout << "--use make_shared--" << std::endl; { std::shared_ptr<int> p2 = std::make_shared<int>(6); std::cout << *p2 << std::endl; } return 0; }
all: g++ test_make_shared.cpp -std=c++11 -o test_make_shared.exe ./test_make_shared
make -k g++ test_make_shared.cpp -std=c++11 -o test_make_shared.exe ./test_make_shared --use shared_ptr-- new 0x600048930 4 new 0x600048950 24 5 delete0x600048930 delete0x600048950 --use make_shared-- new 0x600048930 24 6 delete0x600048930
確かに、make_shared版の方がnewとdeleteの回数が減ってます!なんてこった!shared_ptrを使わない理由がまた1つ減りましたね。C++の進化は止まりませんね。
ちなみに、Factory Method で生成するときに Constructor が Private だった場合にmake_sharedが使えない!という問題は、std::make_shared から private コンストラクタを呼び出すとすればいいようです。
C++は奥深すぎてヤバイですね。
そんじゃまた。