前言
C++11引入的智能指针极大地简化了内存管理,但其中一些高级特性如std::make_shared和std::enable_shared_from_this在使用中存在不少陷阱。本文将从底层原理出发,结合实际案例,深入分析这些特性并提供实用的避坑指南。
一、make_shared:效率与代价的权衡
1.1 内存分配机制对比
传统shared_ptr构造:两次内存分配
std::shared_ptr<MyClass> ptr(new MyClass);
-
第一次分配:为
MyClass对象分配内存 -
第二次分配:为控制块(引用计数、删除器等)分配内存
make_shared:一次内存分配
auto ptr = std::make_shared<MyClass>();
-
单次分配:申请一块足够大的内存,同时容纳控制块和被管理对象
1.2 性能优势
// 性能测试对比
auto start1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 100000; ++i) {
std::shared_ptr<MyClass> ptr(new MyClass);
}
auto end1 = std::chrono::high_resolution_clock::now();
auto start2 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 100000; ++i) {
auto ptr = std::make_shared<MyClass>();
}
au

最低0.47元/天 解锁文章
569

被折叠的 条评论
为什么被折叠?



