为啥unique_ptr的移动比shared_ptr赋值要慢? 在Modern Effective C++中,提倡使用unique_ptr代替裸指针,因为unique_ptr的大小和性能与裸指针基本一致但更安全,而shared_ptr由于由原子变量的存在性能更差,但是同步赋值试下来,unique_ptr的移动很慢。 #include #include #include #include int main() { #define COUNT 100000000 using MyType = int; decltype(auto) u = std::make_unique(); decltype(auto) s = std::make_shared(); decltype(auto) r = new MyType; decltype(auto) u1 = std::move(u); decltype(auto) s1 = s; decltype(auto) r1 = r; auto start = std::chrono::high_resolution_clock::now(); auto finish = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed = finish - start; start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < COUNT; ++i) r = r1; finish = std::chrono::high_resolution_clock::now(); elapsed = finish - start; std::cout << "ptr: " << elapsed.count() << "s\n"; start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < COUNT; ++i) u = std::move(u1); finish = std::chrono::high_resolution_clock::now(); elapsed = finish - start; std::cout << "unique_ptr: " << elapsed.count() << "s\n"; start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < COUNT; ++i) s = s1; finish = std::chrono::high_resolution_clock::now(); elapsed = finish - start; std::cout << "shared_ptr: " << elapsed.count() << "s\n"; } 运行结果: 