boost:初始化共享指针重置与make_shared
boost: Initializing shared pointer reset vs make_shared
除了生成代码的大小之外,使用reset()
初始化函数make_shared()
上的共享指针有什么区别?
使用reset()
的情况1
boost::shared_ptr<A> pA;
pA.reset(new A());
使用make_shared()
的情况2
boost::shared_ptr<A> pA;
pA = boost::make_shared<A>();
通常,使用reset
而不是make_shared
来减小可执行文件的大小是一种好的做法吗?
reset(new T(...))
分配一个堆块,构造对象,为引用计数器分配一个新的堆块,并初始化引用计数器。
make_shared<T>(...)
分配一个稍大于对象所需的堆块,并在同一堆块中构造对象和引用计数器。
make_shared()
运行得更快并且需要更少内存的可能性很高。
但如果您使用的是像Microsoft Visual Studio这样的IDE,则有一个小缺点:Intellisense无法向您显示构造函数中使用的参数的名称。代码工作正常,但编辑make_shared()
调用不舒服。
make_shared<T>
在为T分配的同一内存块中创建引用计数器。这是一种优化。reset
不执行此操作。
相关文章:
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- make 命令如何避免重新编译未更改的源文件?
- MAKE:找不到包含的用户定义的头文件?
- 'make check' GLIBC 运行时的链接问题
- 引用 std::shared:ptr 以避免引用计数
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- make 命令创建 .file,但不创建应用程序文件
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- 如何使用MySQL Connector and Make设置C++项目
- 使用 make 将对象文件放在特定目录中
- 我是 C++ 的新手,我试图调用 make 一个以 2 个类作为其参数的类构造函数
- "Make"失败并出现 Clang 错误 - 如何从 Clang 获得错误?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- Make zmqpp::socket::connect a std::future
- 链接从命令行转换为Make的库
- 将 make 和 cmake 合并到构建系统中