相同模板化的STL代码也会膨胀?

发布于 2022-09-11 23:10:24 字数 1019 浏览 15 评论 0

不同特化的模板会引起代码膨胀这个很明确,但相同特化的模板放在不同的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟火散人牵绊 2022-09-18 23:10:24

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

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

空气里的味道 2022-09-18 23:10:24

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

image.png


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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文