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

news2025/1/26 15:36:08

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.coloradmin.cn/o/1346894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mxxWechatBot微信机器人V2使用教程(图文)最全最详细

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 先看这里 mxxWechatBot功能列表一、前言二、适用人群三、准备工作四、获取账号五、下载资料 六、安装相关软件七、启动客户端八、注入并启动微信九、机器人的基本配置十、自定义接口开发 …

数据库系统概论SQL编程题合集(包含期末题、考研初试题以及复试题)

二、现有数据库casemanage中表结构如下图 1&#xff09;请编写sql语句对年龄进行升序排列 select * from afinfo order by birth;2&#xff09;请编写sql语句查询对“徐”姓开头的人员名单 select * from afinfo where name like 徐%;3&#xff09;请编写sql语句修改“陈晓”…

【28】Kotlin语法进阶——使用协程编写高效的并发程序

提示&#xff1a;此文章仅作为本人记录日常学习使用&#xff0c;若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、Kotlin中的协程1.1 协程的基本用法1.1.1协程与协程作用域1.1.2 使用launch函数创建子协程1.1.3 通过suspend关键声明挂起函数1.1.4 coroutineScope函数 1.2…

对比学习简介

1. 引言 在本教程中&#xff0c;我们将介绍对比学习领域中的相关概念。首先&#xff0c;我们将讨论这种技术背后相关的理论知识&#xff1b;接着&#xff0c;我们将介绍最常见的对比学习的损失函数和常见的训练策略。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 举…

React is not defined解决

组件未引入React报错React is not defined 神奇的是代码内并没有用到React的地方 必需要导入React才不报错 看着就很奇怪 原因是因为React创建组件需要使用到React上的一个方法createClass创建组件 在babel-loader的babel/preset-react预设里写个配置即可不用导入也不报错: //…

《深入理解C++11:C++11新特性解析与应用》笔记七

第七章 为改变思考方式而改变 7.1 指针空值--nullptr 7.1.1 指针空值&#xff1a;从0到NULL&#xff0c;再到nullptr 传统C头文件里NULL是一个宏定义&#xff1a; 在函数重载同时出现int和char *参数版本的函数时&#xff0c;使用NULL作为参数调用函数会调用int参数版本&…

机器学习部分相关概念

数据集(Data Set)即数据的集合&#xff0c;每一条单独的数据被称为样本(Sample)。 对于每个样本&#xff0c;它通常具有一些属性(Attribute)或者特征(Feature)&#xff0c; 特征所具体取得值被称为特征值(Feature Value)。 西瓜数据集 色泽根蒂纹理青绿稍蜷模糊乌黑蜷缩清晰 …

大数据 - 大数据入门第一篇 | 关于大数据你了解多少?

&#x1f436;1.1 概述 大数据&#xff08;BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…

【Linux】内核编译 镜像制作

文章目录 一、Ubuntu内核编译1.1 为什么自己编译内核1.2 Ubuntu 内核源码下载1.21 内核的作用1.22 Linux内核与ubuntu内核1.23 Ubuntu内核源码获取 1.3 在Windows系统下编译ubuntu内核1.4 在Linux系统下编译ubuntu内核 二、镜像制作 一、Ubuntu内核编译 1.1 为什么自己编译内核…

《QDebug 2023年12月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Q_REVISION 标记的信号槽或者 REVISION 标记的属性&#xff0c;在子类中访问 Q_REVISION 是 Qt 用来做版本控制的一个宏。以 QQuickWindow 为例&#xff0c;继承后去访问 REVISION 标记的 opacity 属性或者 Q_REVISION…

nodejs+vue+微信小程序+python+PHP的林业信息管理系统的设计与实现-计算机毕业设计推荐

本文先充分调查林业信息管理系统的需求分析&#xff0c;深入剖析系统应该具有的功能&#xff0c;并设计完善的数据库。利用成熟的开发技术完成编码工作&#xff0c;林业信息管理系统可以为林业局领导提供业务管理功能&#xff0c;林业局领导也就是系统的管理员&#xff0c;具有…

【LeetCode】每日一题 2023_12_31 一年中的第几天(日期)

文章目录 随便聊聊时间题目&#xff1a;一年中的第几天题目描述代码与解题思路 随便聊聊时间 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 12 月的打卡勋章&#xff0c;get&#xff01; 题目&#xff1a;一年中的第几天 题目链接&#xff1a;1154. 一年中…

数据结构期末复习(1)数据结构和算法 线性表

数据结构期末总复习&#xff08;gaois课堂版&#xff09; 数据结构的概念 数据结构是计算机科学中的一个重要概念&#xff0c;它指的是组织和存储数据的方式。数据结构可以帮助我们高效地操作和管理数据&#xff0c;使得计算机程序能够更加有效地执行各种任务。 数据结构有很…

【JavaScript】面向对象继承

目录 一、前言二、问题是最好的老师1、为什么要使用继承2、如何实现继承 三、面向对象继承方式1、借用构造函数继承1&#xff09;、优点2&#xff09;、缺点 2、原型链继承1&#xff09;、完整代码2&#xff09;、缺点 3、组合继承&#xff08;原型链借用构造函数&#xff09;1…

Rust学习笔记000 安装

安装命令 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installerWelcome to Rust!This will download and install the official compiler for the Rust programming la…

C语言转WebAssembly的全流程,及Web端调用测试

第一步&#xff1a;安装环境 参考网址&#xff1a;https://emscripten.org/docs/getting_started/downloads.html 具体过程&#xff1a; 克隆代码&#xff1a;git clone https://github.com/emscripten-core/emsdk.git进入代码目录&#xff1a;cd emsdk获取最新远端代码&…

关键字:try-catch关键字

在 Java 中&#xff0c;try-catch关键字用于异常处理。它们允许编写代码来捕获和处理异常&#xff0c;以确保程序能够在出现问题时合理地处理它们而不会崩溃。 以下是try-catch关键字的基本语法&#xff1a; 在try块中编写可能会抛出异常的代码。如果在try块中的任何代码抛出…

【Proteus仿真】【STM32单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈值…

将数据“0x0f“写入AT24C02再读出送P1口显示

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写入…

浅析xxl-obj分布式任务调度平台RCE漏洞

文章目录 前言本地环境搭建1、初始化数据库2、搭建调度中心3、搭建出执行器 XXL-JOB漏洞1、后台弱口令->RCE2、未授权API->RCE3、默认accessToken4、CVE-2022-361575、SSRF漏洞->RCE 总结 前言 在日常开发中&#xff0c;经常会用定时任务执行某些不紧急又非常重要的事…