Насколько мне известно об управлении ресурсами, выделение чего-то в куче (оператор new
) всегда должно быть медленнее, чем выделение в стеке (автоматическое хранилище), потому что стек представляет собой структуру на основе LIFO, требует минимальной бухгалтерской отчетности, а указатель на следующий адрес для распределения является тривиальным.
До сих пор так хорошо. Теперь посмотрим на следующий код:
/* ...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
Во втором измерении, кроме вызова оператора new
, должен завершиться конструктор std::shared_ptr
(auto sh_ptr1
). Я не могу понять, почему это быстрее, чем регулярное выделение.
Какое объяснение для этого?