【发布时间】:2019-11-26 06:56:25
【问题描述】:
在每篇文章中都写到make_shared 比shared_ptr<T>(new T) 更有效,因为分配了一个内存而不是两个。但我试试这段代码:
#include <cstdio>
#include <ctime>
#include <memory>
#include <vector>
static const size_t N = 1L << 25;
int main(void) {
clock_t start = clock();
for ( size_t rcx = 0; rcx < N; rcx++ ) {
auto tmp = std::shared_ptr<std::vector<size_t>>( new std::vector<size_t>( 1024 ) );
}
clock_t end = clock();
printf("shared_ptr with new: %lf\n", ((double)end - start) / CLOCKS_PER_SEC);
start = clock();
for ( size_t rcx = 0; rcx < N; rcx++ ) {
auto tmp = std::make_shared<std::vector<size_t>>( 1024 );
}
end = clock();
printf("make_shared: %lf\n", ((double)end - start) / CLOCKS_PER_SEC);
return 0;
}
编译:
g++ --std=c++14 -O2 test.cpp -o test
得到了这个结果:
shared_ptr with new: 10.502945
make_shared: 18.581738
boost::shared_ptr 也一样:
shared_ptr with new: 10.778537
make_shared: 18.962444
This question 回答了 LLVM 的 libc++ 已损坏,但我使用 GNU 的 libstdc++。
那么,为什么make_shared 慢?
附:用-O3优化得到了这个结果:
shared_ptr with new: 5.482464
make_shared:4.249722
boost::shared_ptr 也一样。
【问题讨论】:
-
“更高效”并不总是意味着“更快”。
-
我运行你的代码,
make_shared在 Linux 服务器上使用-O2和-O3更快。您的 GCC、libstdc++ 和 glibc 的架构、操作系统和版本是什么? -
使用 msvc
make_shared也更快。我得到shared_ptr with new: 12.624000 make_shared: 10.969000release/x64/cl 版本 19.23.28106.4 --- 使用 release/x86 它更快:shared_ptr with new: 10.610000 make_shared: 7.620000 -
你试过让
make_shared循环在new循环之前运行吗?
标签: c++ performance shared-ptr make-shared