c++预编译头文件

文章目录

    • c++预编译头文件
      • 1.使用g++编译预编译头文件
      • 2.使用visual studio进行预编译头文件
        • 2.1visual studio如何设置输出预处理文件(.i文件)
        • 2.2visual studio 如何设置预编译(初始创建空项目的情况下)
        • 2.3 visual studio打开输出编译时间

c++预编译头文件

预编译头文件(Precompiled Header,简称PCH)是一种提高编译速度的技术。在C++等编程语言中,每次编译程序时,编译器都需要处理所有的头文件。由于头文件通常包含大量的宏定义、类型定义和函数声明等内容,这一步骤可能会消耗较多的时间。尤其是当项目变得非常庞大且多个源文件共享相同的头文件时,这种重复处理会显著增加整个项目的构建时间。

预编译头文件的基本思想是将一些频繁使用的头文件预先编译成一种中间形式,然后在后续的编译过程中直接使用这个已经编译好的结果,而不是每次都从头开始重新解析这些头文件这样做可以大大减少编译时间,尤其是在大型项目中效果尤为明显

  • 使用预编译头文件的好处包括
  1. 加速编译过程:减少了对常用头文件内容的重复解析。
  2. 提高开发效率:更快的编译反馈循环可以让开发者更高效地工作。
  3. 资源节约:降低了CPU和内存的使用量。

如何使用预编译头文件

不同IDE或编译环境对于预编译头文件的支持方式可能有所不同。以下是一些常见的设置方法:

  • Visual Studio (VS): 在VS中,可以通过项目属性来指定一个特定的头文件作为预编译头。一般需要创建一个专门用于预编译的头文件(例如stdafx.h),并在项目设置里指定该文件为预编译头文件。同时,还需要在源代码文件顶部加入#include "stdafx.h"作为第一个包含指令。
  • GCC/Clang: 这些编译器通过命令行选项支持预编译头文件。例如,使用-Winvalid-pch来生成预编译头文件,然后用-include选项指定要包含的预编译头文件。
  • Xcode: Xcode也支持预编译头文件,并且可以通过项目的Build Settings进行配置。

需要注意的是,虽然预编译头文件能够显著提升编译速度,但不恰当地使用也可能导致问题,比如增加了编译器之间的依赖性,或者使得某些编译错误难以定位。因此,在实际应用中应当根据项目实际情况合理选择是否以及如何使用这项技术。

下方两个文件其实是等价的

在这里插入图片描述

在这里插入图片描述

  • 上图中下方代码分离出我们需要的头文件单独到一个文件中,方便我们进行头文件预编译

1.使用g++编译预编译头文件

  • 分别测试第一次编译,再修改部分代码进行第二次编译,两次编译时间如下

在这里插入图片描述

  • 直接对分离出的pch.h文件进行编译,我们一般对cpp文件编译,但对头文件编译就会生成下方截图所示文件。

在这里插入图片描述

  • 将之前生成的exe文件删除,重新对main.cpp进行编译,分别测第一次编译时间,然后修改部分代码再次重新编译第二次,我们发现两次时间都大大减少。

在这里插入图片描述

2.使用visual studio进行预编译头文件

2.1visual studio如何设置输出预处理文件(.i文件)
  • 右击项目,设置属性

在这里插入图片描述

  • 选择预处理器,将预处理到文件改为是

在这里插入图片描述

  • 这样运行的程序文件下就会出现.i文件,打开.i预处理文件,如下,可见加入的那些头文件代码量之多,这些都要重新编译(如果不进行预编译头文件的话)
    在这里插入图片描述
2.2visual studio 如何设置预编译(初始创建空项目的情况下)
  • 进行预编译:
    • 创建pch.cpp,引入pch.h文件,右击cpp文件选中属性:

在这里插入图片描述

  • 选择预编译头,改为创建

在这里插入图片描述

  • 再右击项目属性,设置项目属性。选择使用预编译头,并且选择预编译头文件

在这里插入图片描述

在这里插入图片描述

2.3 visual studio打开输出编译时间
  • 选择工具,打开选项。

在这里插入图片描述

  • 找到vc++ 项目设置,把生成计时改为是。

在这里插入图片描述

  • 一开始项目设置属性预编译头为不使用预编译头的情况:
  • 第一次编译:在这里插入图片描述
    改代码后第二次编译情况如下在这里插入图片描述
  • 将项目属性设置为使用预编译头后:
    • 第一次编译情况如下:(跟不使用的差不多)在这里插入图片描述
  • 改写部分代码后第二次进行编译,情况如下:(第二次时间大大减少)在这里插入图片描述

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

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

相关文章

SeggisV1.0 遥感影像分割软件【源代码】讲解

在此基础上进行二次开发,开发自己的软件,例如:【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等,不管是您用来个人学习还是公司研发需求,都相当合适,包您满…

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识,发现了一份特别好的文档快乐的 Linux 命令行,翻译者是happypeter,作者当年也在慕课录制了react等前端相关的视频,通俗易懂,十分推荐 关于Linux的目录,多数博客已有详细介绍…

Fastapi + vue3 自动化测试平台---移动端App自动化篇

概述 好久写文章了,专注于新框架,新UI界面的实践,废话不多说,开搞 技术架构 后端: Fastapi Airtest multiprocessing 前端: 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…

详解Vue设计模式

详解 vue 设计模式 ​ Vue.js 作为一个流行的前端框架,拥有许多设计模式,这些设计模式帮助开发者更好地组织和管理代码,提升代码的可维护性、可扩展性和可读性。Vue 设计模式主要体现在以下几个方面: 1. 组件化设计模式 (Compon…

了解Linux —— 理解其中的权限

前言 在了解Linux权限之前,先来探讨我们使用的shell 命令它到底是什么? Linux 是一个操作系统,我们称其为内核(kernel) ,正常情况下,我们一般用户操作并不是去直接使用内核,而是通过kernel 的外壳程序&…

WebHID API演示Demo教程:设备列表,设备连接,数据读写

1. 简介 WebHID API允许网页应用直接与HID(人机接口设备)进行通信。本教程将演示如何创建一个基础的WebHID应用,实现以下功能: 显示和获取HID设备列表连接/断开HID设备读取设备数据向设备发送数据 2. 兼容性和前提条件 2.1 浏览…

中安证件OCR识别技术助力鸿蒙生态:智能化证件识别新体验

在数字化和智能化的浪潮中,伴随国产化战略的深入推进,国产操作系统和软件生态的建设逐渐走向成熟。鸿蒙操作系统(HarmonyOS Next)作为华为推出的重要操作系统,凭借其开放、灵活和高效的特点,正在加速在多个…

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换

目录 概述 PDF/A 是什么?与 PDF 有何不同? 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…

面向对象(二)——类和对象(上)

1 类的定义 做了关于对象的很多介绍,终于进入代码编写阶段。 本节中重点介绍类和对象的基本定义,属性和方法的基本使用方式。 【示例】类的定义方式 // 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致! …

【HarmonyOS】鸿蒙应用地理位置获取,地理名称获取

【HarmonyOS】鸿蒙应用地理位置获取,地理名称获取 一、前言 首先要理解地理专有名词,当我们从系统获取地理位置,一般会拿到地理坐标,是一串数字,并不是地理位置名称。例如 116.2305,33.568。 这些数字坐…

关于数据库数据国际化方案

方案一:每个表设计一个翻译表 数据库国际化的应用场景用到的比较少,主要用于对数据库的具体数据进行翻译,在需要有大量数据翻译的场景下使用,举个例子来说,力扣题目的中英文切换。参考方案可见: https://b…

「Mac畅玩鸿蒙与硬件37」UI互动应用篇14 - 随机颜色变化器

本篇将带你实现一个随机颜色变化器应用。用户点击“随机颜色”按钮后,界面背景会随机变化为淡色系颜色,同时显示当前的颜色代码,页面还会展示一只猫咪图片作为装饰,提升趣味性。 关键词 UI互动应用随机颜色生成状态管理用户交互…

跟着官方文档快速入门RAGAS

官网: Ragas Ragas(Retrieval-Augmented Generation, RAG)是一个基于简单手写提示的评估框架,通过这些提示全自动地衡量答案的准确性、 相关性和上下文相关性。这种评估方法不需要访问人工注释的数据集或参考答案,使得评估过程更…

掌握 Spring Boot 中的缓存:技术和最佳实践

缓存是一种用于将经常访问的数据临时存储在更快的存储层(通常在内存中)中的技术,以便可以更快地满足未来对该数据的请求,从而提高应用程序的性能和效率。在 Spring Boot 中,缓存是一种简单而强大的方法,可以…

我谈冈萨雷斯对频域滤波的误解——快速卷积与频域滤波之间的关系

在Rafael Gonzalez和Richard Woods所著的《数字图像处理》中,Gonzalez对频域滤波是有误解的,在频域设计滤波器不是非得图像和滤波器的尺寸相同,不是非得在频域通过乘积实现。相反,FIR滤波器设计都是构造空域脉冲响应。一般的原则是…

AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。

大家好,我是微学AI,今天给大家介绍一下AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。本文利用专家模…

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文,一手掌握,你值得拥有,让我们开始吧~ ufw 与 iptables的关系 理论介绍: ufw(Uncomplicated Firewall)是一个基于iptables的前端工具&#xf…

MySQL之数据完整性

数据的完整性约束可以分为三类: 实体完整性、域完整性和引用完整性。 说来说去(说主键,外键,以及⼀些约束) 1、实体完整性 (实体就是行) 什么是关系型数据库? 一个表代表一类事务&#xff0…