相同模板化的STL代码也会膨胀?
不同特化的模板会引起代码膨胀这个很明确,但相同特化的模板放在不同的cpp里面也会引起膨胀么?
a.cpp
#include <vector>
int xx()
{
std::vector<int> aa;
aa.push_back(100);
return aa[0];
}
b.cpp
#include <vector>
int main()
{
std::vector<int> aa;
aa.push_back(100);
return aa[0];
}
把a.cpp和b.cpp链接到一个动态库里面去,是31k
clang++ -c a.cpp -o a.o && clang++ -c b.cpp -o b.o && clang++ a.o b.o -shared -fPIC -o libtest.so && ll libtest.so
-rwxr-xr-x 1 hector staff 31K 10 22 13:11 libtest.so
如果把a.cpp里面的vector去掉是21k
#include <vector>
int xx()
{
//std::vector<int> aa;
//aa.push_back(100);
//return aa[0];
return 100;
}
clang++ -c a.cpp -o a.o && clang++ -c b.cpp -o b.o && clang++ a.o b.o -shared -fPIC -o libtest.so && ll libtest.so
-rwxr-xr-x 1 hector staff 21K 10 22 13:14 libtest.so
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
每个cpp都是不同编译单元,相互之间独立,模板当然也会被重复实例化多次。
链接阶段阶段根据优化flag的设计会消除重复实例化的函数,但默认O0的话可能就懒得做了(大项目链接起来很花时间的)。你不妨试试不同优化级别。
实例化的模板里的函数如果内连了的话,那自然也会造成多份代码,不过这个就不是模板的锅而是内连了的。
另外当然是只有用到的函数才会生成代码,用不到的就算生成了也是死代码啊。不过用不到的函数依旧会做合法性检测。
我做了一些实验,结果表明,是是否调用
push_back
的原因。猜测如果没有调用模板类的方法,这些方法都不会生成?相同的模板特化不会导致代码膨胀,我用你的实例实验了一下也确实不会,环境是windows + mingw + gcc。不知道你是什么环境和实验过程?