缩减dll加载时内存占用,可以通过两个方面去处理:
1. 减少dll物理大小;
2. 减少dll依赖的dll个数。
一、减少dll物理大小
dll由数据段和代码段组成,故可以从减少数据段和代码段两个方面入手
1.处理头文件中的静态全局变量
将在头文件中定义的静态全局变量,改为在头文件中声明,源文件中定义。
——此方法修改起来相对较快,dll缩减幅度最大
(如果其他dll中要用到这些静态变量,需要导出)
2.处理源文件中的静态全局变量
将在多个源文件中都定义过的相同静态全局变量,改为在一个文件的头文件中声明,源文件中定义。之后,哪个文件要用这个静态变量,就引用对应的头文件。
——次方法比较耗时,操作起来相当无聊
3.去除无用头文件
去除头文件、源文件中包含的无用头文件。
可以用以下两个工具协助发现无用头文件:
1) ReSharper:一个VS插件,代码中无用的头文件,会用灰色背景显示。
A. 优点:
Ø 支持在头文件、源文件中检索无用头文件
B. 缺点:
Ø 检索结果一般都是准确的,但会有许多无用头文件没有检索出来;
Ø 只能一个文件一个文件的处理。
2) cxx-clean-include:国人写的一个小工具,可以部署到VS中。
A. 优点:
Ø 可以删除整个项目或单个文件中的无用头文件
Ø 比起ReSharper,能检索出更多的头文件
B. 缺点:
Ø 有误报,误报率大概为30%左右,需要手动干预。操作前一定要备份代码;
Ø 小的demo项目,可以删除头文件中的无用头文件,但对于大的项目,不会对头文件做处理;
——这种方法,操作工作量与最终效果,仅次于删除头文件中的静态变量
4. 删除无用代码
删除代码中的无用的代码,主要是接口。可以用代码覆盖率工具协助。
5. 代码重构,合并接口
针对相同代码较多的接口,可以合并,提炼公共接口。
——这种方法,需要在平时持续做。短时间内无法解决dll大的问题。
二、减少dll依赖的dll个数
一个dll如果依赖其他dll,加载该dll时也会加载其依赖的dll,从而增大加载dll时的内存开销。
1. 删除无用的dll依赖。在vs的附加依赖项中删除。
2. 如果只是依赖了某个dll的少量接口(几个),可以在自身dll中实现这些接口,不再依赖其他dll。这种方法可以大幅减少加载dll时的内存开销,但这种场景比较少。
三、 总结:
从工作量与效果考虑,建议先处理头文件中的静态全局变量,再删除无用头文件,然后是删除无用dll、冗余代码,最后是处理源文件中的静态全局变量。