前端学习网站,网泰网站建设网络推广,wordpress如何设置注册用户名大于4个字符,饶平网站建设公司2023年就要过去#xff0c;马上要跨如2024年。祝大家在新的一年#xff0c;有个好收成。 一直以来不是很确定#xff1a;
同样的的模板#xff0c;在各个cpp分别出现#xff0c;编译器要实现几份#xff1f;
研究一下。 用命令行的编译方法#xff0c;参考#xff1a…2023年就要过去马上要跨如2024年。祝大家在新的一年有个好收成。 一直以来不是很确定
同样的的模板在各个cpp分别出现编译器要实现几份
研究一下。 用命令行的编译方法参考
演练在命令行上编译本机 C 程序 | Microsoft Learn 首先启动vs的开发者控制台 创建a.cpp内容如下。
void fun1()
{int x0;x;
}进行编译
进编译成obj如果不用选项/c会进行link的动作会报编译错误。加了/c就只是编译 查看发现生成了 a.obj文件它的尺寸是1KB 用dumpbin查看符号
注意虽然fun1函数里用到了int类型的变量但在dumpbin出来的时候没有int的字样因为它不是符号symbol 将a.cpp改一下加入std::vector
用double实例化std::vector
a.cpp#includevector
void fun1()
{std::vectordouble a;int x0;x;
}
重复刚才的编译命令cl /c /EHsc a.cpp
发现a.obj的大小变成了8KB 可以看出模板的引入对obj的个头影响。
看看符号因为内容较多所以输出到文本文件里 搜索double字样有65个匹配说明出现了一些用double实例化的一些函数symbol。也可以看到vector的出现 创建b.cpp内容和a.cpp一样
b.cpp#includevector
void fun1()
{std::vectordouble a;int x0;x;
}
然后对b.cpp进行编译 观察b.obj的大小发现也是8KB大小 compare一下a.obj和b.obj 发现二进制应该是一致的。
这就说明了对于每个cpp编译产生自己的obj文件都会独自对模板进行实例化。这就是重复的内容。消耗了编译时间增加了编译出来的obj的大小。 也可以同时对a.cpp和b.cpp进行编译可以同时生成a.obj和b.obj a.cpp
#includevector
void fun1()
{std::vectordouble a;int x0;x;
}b.cpp
#includevector
void fun2()
{std::vectordouble a;int x0;x;
}hello.cpp
#include iostream
using namespace std;
int main()
{cout Hello, world, from Visual C! endl;
} 编译出hello.exe hello.exe文件的大小是189KB比a.obj、b.obj和hello.obj加起来都大 各个obj里的重复的symbol会不会合并起来
分别在a.cpp和b.cpp里出现的std::vectordouble在最后link的时候应该是被合并成了一份。但这个例子说明不了。
实际项目说明了会合并
我们项目里的一个例子可以说明
obj加起来超过2G最后生成的dll只有12MB。debug版