研究:同样的C++模板在多个cpp里出现,编译器是否要重复生成?

2023年就要过去,马上要跨如2024年。祝大家在新的一年,有个好收成。

一直以来不是很确定:

同样的的模板,在各个cpp分别出现,编译器要实现几份?

研究一下。

用命令行的编译方法,参考:

演练:在命令行上编译本机 C++ 程序 | Microsoft Learn

首先,启动vs的开发者控制台:

 

创建a.cpp,内容如下。

void fun1()
{int x=0;x++;
}

进行编译

(进编译成obj,如果不用选项/c,会进行link的动作,会报编译错误。加了/c,就只是编译)

查看,发现生成了 a.obj文件,它的尺寸是1KB:

 用dumpbin查看符号

,注意,虽然fun1函数里用到了int类型的变量,但在dumpbin出来的时候,没有int的字样,因为它不是符号(symbol):

 将a.cpp改一下,加入std::vector

用double实例化std::vector:

a.cpp#include<vector>
void fun1()
{std::vector<double> a;int x=0;x++;
}

重复刚才的编译命令:cl  /c /EHsc a.cpp

发现a.obj的大小变成了8KB:

 可以看出,模板的引入,对obj的个头影响。

看看符号,因为内容较多,所以输出到文本文件里:

 搜索double字样,有65个匹配,说明出现了一些用double实例化的一些函数(symbol)。也可以看到vector的出现:

 创建b.cpp,内容和a.cpp一样

b.cpp#include<vector>
void fun1()
{std::vector<double> a;int x=0;x++;
}

然后对b.cpp进行编译:

观察b.obj的大小,发现也是8KB大小

compare一下a.obj和b.obj:

 

发现,二进制应该是一致的。

这就说明了,对于每个cpp编译产生自己的obj文件,都会独自对模板进行实例化。这就是重复的内容。消耗了编译时间,增加了编译出来的obj的大小。

也可以同时对a.cpp和b.cpp进行编译,可以同时生成a.obj和b.obj:

a.cpp
#include<vector>
void fun1()
{std::vector<double> a;int x=0;x++;
}b.cpp
#include<vector>
void fun2()
{std::vector<double> a;int x=0;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::vector<double>在最后link的时候,应该是被合并成了一份。但这个例子说明不了。

实际项目说明了会合并

我们项目里的一个例子可以说明:

obj加起来超过2G,最后生成的dll只有12MB。(debug版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/311659.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识计算机网络——计算机网络的组成

计算机网络是由多个计算机和网络设备组成的系统&#xff0c;通过通信协议实现数据传输和信息交换。它是现代社会信息技术的重要支撑&#xff0c;广泛应用于各个领域。本文将介绍计算机网络的主要组成部分&#xff0c;包括硬件设备、软件协议和网络服务。 一、硬件设备 计算机网…

二维动态规划问题,python解决最长回文子串

一个算法中的经典问题&#xff0c;求最长回文子串问题&#xff0c;其实是可以归于二维动态规划问题。 对于给定的一个字符串中&#xff0c;找到这个字符串中的回文子串&#xff0c;回文子串的概念是从前往后正向的读和从后往前反向的读都是完全相同的字符串。 对这个问题进行…

kivy中用anchrolayout

说明 AnchorLayout 是 Kivy 框架中用于管理界面元素位置的一种布局方式。AnchorLayout 的特点是&#xff0c;它可以将其子元素锚定到布局的边界上&#xff0c;例如顶部、底部、左侧或右侧。这使得在需要元素相对于其容器边界保持固定位置时非常有用。 界面 # mylayout.kvAnch…

matplotlib绘制柱状图

代码 import matplotlib.pyplot as plt import numpy as np# 数据 categories [denoise, double-digit, 100% 5R] existence [0.9778, 0.9768, 0.9767] non_existence [0.9772, 0.9767, 0.9778]# 设置每组柱状图的宽度 bar_width 0.25# 计算每组柱状图的位置 x np.arange…

Zabbix图形显示乱码修复

2023年12月29日&#xff0c;星期五&#xff0c;2023年最后一个工作日了&#xff0c;明天就开始放假元旦了&#xff0c;去年水了31篇&#xff0c;今年到目前为止才水了30篇&#xff0c;所以这篇也水一下来充个数。祝大家元旦快乐&#xff0c;新的一年里越来越好。 被监控主机指…

【华为OD机试真题2023CD卷 JAVAJS】测试用例执行计划

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 测试用例执行计划 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品当前迭代周期内有N个特性()需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用…

flutter开发windows软件字体显示粗细不一样,而且还有繁体解决办法

开始学习flutter开发windows软件&#xff0c;解决出现了下面的情况&#xff0c;字体粗细不一样&#xff0c;而且还有繁体&#xff1f;这是什么情况&#xff0c;在安卓模拟器上都没有问题的啊&#xff0c;怎么到windows上就有问题了&#xff1f;然后就开始踩坑之路。 经研究发现…

迈向通用异常检测和理解:大规模视觉语言模型(GPT-4V)率先推出

PAPERCODEhttps://arxiv.org/pdf/2311.02782.pdfhttps://github.com/caoyunkang/GPT4V-for-Generic-Anomaly-Detection 图1 GPT-4V在多模态多任务异常检测中的综合评估 在这项研究中&#xff0c;我们在多模态异常检测的背景下对GPT-4V进行了全面评估。我们考虑了四种模式&#…

ssm基于web 的个人时间管理系统+vue论文

基于web 的个人时间管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的个人时间信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人…

vscode调试 反汇编c/c++ 查看汇编代码gdb/lldb

先看下流程&#xff01; 先看下流程&#xff01; 有问题请留言&#xff01; 文章目录 必备F5开启调试左侧侧边栏->确保打开回调栈右键函数栈->查看反汇编 方法二&#xff1a;手动输入命令查看 必备 使用c/c 插件&#xff0c;这应该是必备的。 F5开启调试 左侧侧边栏-&…

如何开发一个google插件(二)

前言 在上一篇文章如何开发一个google插件(一)里主要介绍了google插件的基本结构。 在这篇文章中主要结合reactwebpack进行一个代码演示&#xff0c;源码地址&#xff1a;源码地址 下载源码后打开浏览器的扩展程序管理->加载已解压的扩展程序&#xff0c;即可调试插件 此…

python如何读取被压缩的图像

读取压缩的图像数据&#xff1a; PackBits 压缩介绍&#xff1a; CCITT T.3 压缩介绍&#xff1a; 读取压缩的图像数据&#xff1a; 在做图像处理的时候&#xff0c;平时都是使用 函数io.imread() 或者是 函数cv2.imread( ) 函数来读取图像数据&#xff0c;很少用PIL.Image…