引入了智能指针可以解决了C++里的各种资源泄漏问题。但我发现我写的程序代码编译出来的文件都较原来的文件大。
于是我想做一个实验,看智能指针会带来多大的文件体积开销。
于是做了个对比实验:
raw_ptr.cpp
#include
smart_ptr.cpp
#include
empty.cpp
#include
Makefile
all:
g++ -o raw_ptr raw_ptr.cpp -O2
g++ -o smart_ptr smart_ptr.cpp -O2
g++ -o empty empty.cpp -O2
strip raw_ptr
strip smart_ptr
strip empty
编译得到的结果:
empty 是什么功能都没有,编译它是为了比较出,raw_ptr.cpp 中应用程序代码所占有空间。
将 raw_ptr 与 smart_ptr 都减去 empty 的大小:
- raw_ptr 4192B
- smart_ptr 8360B
而 smart_ptr 比 raw_ptr 多出 4168B,这多出来的就是使用智能指针的开销。
目前来看,智能指针额外占用了一倍的程序空间。它们之间的关系是呈倍数增长,还是别的一个关系?
那么引入智能指针是哪些地方的开销呢?
大概有:
- 类模板 shared_ptr<T>, weak_ptr<T> 为每个类型生成的类。
- 代码逻辑中对智能指针的操作。
第一项是可预算的,有多少个类,其占用的空间是可预知的。而第二项,是很不好把控,对指针对象访问越多越占空间。
以 mqtt_client 做对比实验
如下为不使用智能指针编译时 -Os -O2,最后 strip 后的结果:
如果为使用智能指针编译后的结果:
可以看出,多出了:78K,大概多出整体代码逻辑的一半。
总结:
使用智能指针的代价会使程序的体积多出一半。