相同模板化的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
阅读 2.8k
2 个回答

每个cpp都是不同编译单元,相互之间独立,模板当然也会被重复实例化多次。
链接阶段阶段根据优化flag的设计会消除重复实例化的函数,但默认O0的话可能就懒得做了(大项目链接起来很花时间的)。你不妨试试不同优化级别。
实例化的模板里的函数如果内连了的话,那自然也会造成多份代码,不过这个就不是模板的锅而是内连了的。

另外当然是只有用到的函数才会生成代码,用不到的就算生成了也是死代码啊。不过用不到的函数依旧会做合法性检测。

我做了一些实验,结果表明,是是否调用push_back的原因。猜测如果没有调用模板类的方法,这些方法都不会生成?

image.png


相同的模板特化不会导致代码膨胀,我用你的实例实验了一下也确实不会,环境是windows + mingw + gcc。不知道你是什么环境和实验过程?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题