不同特化的模板会引起代码膨胀这个很明确,但相同特化的模板放在不同的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
每个cpp都是不同编译单元,相互之间独立,模板当然也会被重复实例化多次。
链接阶段阶段根据优化flag的设计会消除重复实例化的函数,但默认O0的话可能就懒得做了(大项目链接起来很花时间的)。你不妨试试不同优化级别。
实例化的模板里的函数如果内连了的话,那自然也会造成多份代码,不过这个就不是模板的锅而是内连了的。
另外当然是只有用到的函数才会生成代码,用不到的就算生成了也是死代码啊。不过用不到的函数依旧会做合法性检测。