new
リソース管理に関する私の知識によると、スタックは LIFO ベースの構造であるため、ヒープ ( operator ) に何かを割り当てると、スタック (自動ストレージ) に割り当てるよりも常に遅くなるはずです。次に割り当てるアドレスのポインタは自明です。
ここまでは順調ですね。次のコードを見てください。
/* ...includes... */
using std::cout;
using std::cin;
using std::endl;
int bar() { return 42; }
int main()
{
auto s1 = std::chrono::steady_clock::now();
std::packaged_task<int()> pt1(bar);
auto e1 = std::chrono::steady_clock::now();
auto s2 = std::chrono::steady_clock::now();
auto sh_ptr1 = std::make_shared<std::packaged_task<int()> >(bar);
auto e2 = std::chrono::steady_clock::now();
auto first = std::chrono::duration_cast<std::chrono::nanoseconds>(e1-s1);
auto second = std::chrono::duration_cast<std::chrono::nanoseconds>(e2-s2);
cout << "Regular: " << first.count() << endl
<< "Make shared: " << second.count() << endl;
pt1();
(*sh_ptr1)();
cout << "As you can see, both are working correctly: "
<< pt1.get_future().get() << " & "
<< sh_ptr1->get_future().get() << endl;
return 0;
}
結果は、上で説明したものと矛盾しているようです。
レギュラー:6131
共有する: 843
ご覧のとおり、どちらも正しく機能しています: 42 & 42
プログラムは終了コード: 0 で終了しました
2 番目の測定では、 operator の呼び出しとは別に、 ( )new
のコンストラクターを終了する必要があります。なぜこれが通常の割り当てよりも速いのか理解できないようです。std::shared_ptr
auto sh_ptr1
これについての説明は何ですか?