当前位置: 首页 > news >正文

Effective C++ 条款31:将文件间的编译依存关系降至最低

文章目录

    • 条款31:将文件间的编译依存关系降至最低
      • 最小化编译依赖关系的最佳实践
      • 通过减少编译依赖的好处
      • 总结

条款31:将文件间的编译依存关系降至最低

为了减少编译依赖关系,应该将接口与实现分离,并尽量减少头文件之间的依赖。这有助于加快编译速度,降低因代码变化引起的编译重新构建的时间。

最小化编译依赖关系的最佳实践

  1. 分离接口和实现
    将类的接口和实现分开,通常做法是将接口声明放在头文件中,而将实现代码放在源文件中。这样做可以避免头文件频繁改变导致的重新编译。
// Widget.h: 声明接口
class Widget {
public:void display();
};// Widget.cpp: 实现
#include "Widget.h"
void Widget::display() {// 实现代码
}
  1. 使用 object reference 或 object pointer 替代 object
    当使用对象时,如果对象引用或指针足以完成任务,尽量不要直接传递整个对象。通过引用或指针传递可以减少对象的拷贝,降低编译时依赖。
// 如果只需要访问对象,可以使用引用
void processWidget(const Widget& widget);  // 只传递引用
  1. 使用 class 声明式替换 class 定义式
    为了减少编译依赖,应该尽量在头文件中只提供类声明,而将类的实现放在源文件中。通过这种方式,其他文件仅依赖于声明,减少了编译时的依赖性。
// Widget.h: 仅声明
class Widget;// Widget.cpp: 定义
#include "Widget.h"
void Widget::display() {// 实现代码
}
  1. 使用 Handle class 或 Interface class
    使用 “Handle class” 和 “Interface class” 是一种常见的降低编译依赖的技术。Handle class 通常是一个不包含数据的类,只包含指针或者引用,避免了类的完整定义暴露。Interface class 是一个纯虚类,表示类的接口,所有实现细节都隐藏在派生类中。
// WidgetHandle.h: 声明类的接口
class WidgetHandle {
public:virtual void display() = 0;  // 纯虚函数
};// WidgetHandle.cpp: 实现
#include "WidgetHandle.h"
// 实现函数
  1. 使用声明式和定义式的不同头文件
    通过将声明和定义分开到不同的头文件中,可以使头文件的编译依赖最小化。声明文件只包含类的接口,而定义文件包含类的实现。
// WidgetDecl.h: 声明
class Widget;// WidgetDef.h: 定义
#include "WidgetDecl.h"
class Widget {
public:void display() { ... }
};

通过减少编译依赖的好处

  • 加快编译速度:减少依赖关系的传递,避免无关代码的重新编译,减少编译时间。
  • 提高可维护性:代码修改时不必修改过多的依赖文件,降低了维护成本。
  • 提高灵活性:依赖于声明而不是定义使得系统的扩展性和灵活性更高。修改实现不需要重新编译所有依赖该实现的文件。

总结

  • 分离接口和实现:通过分离接口和实现,减少了文件之间的依赖关系。
  • 引用或指针传递:避免直接传递对象,尽量使用引用或指针来减少拷贝和依赖。
  • 声明式替代定义式:尽可能在头文件中只提供声明,避免暴露实现细节。
  • 使用 Handle 和 Interface 类:通过 handle 类和接口类设计模式来最小化依赖关系,增强系统的灵活性。

减少编译依赖关系是提升大型项目可维护性和编译效率的关键,遵循这些原则有助于构建高效且易于扩展的系统。

相关文章:

Effective C++ 条款31:将文件间的编译依存关系降至最低

文章目录 条款31:将文件间的编译依存关系降至最低最小化编译依赖关系的最佳实践通过减少编译依赖的好处总结 条款31:将文件间的编译依存关系降至最低 为了减少编译依赖关系,应该将接口与实现分离,并尽量减少头文件之间的依赖。这…...

python数据分析之爬虫基础:scrapy详解

一、爬虫工程化 在之前的爬虫学习中基本已经掌握了爬虫这门技术的大多数技术点,但是我们现在写的代码还很流程化,很难进行商用,想要爬虫达到商用级别,必须要对我们现在编写的爬虫进行大刀阔斧式的重组,以达到工程化的…...

openwrt 负载均衡方法 openwrt负载均衡本地源接口

openwrt 负载均衡方法 openwrt负载均衡本地源接口_mob6454cc647bdb的技术博客_51CTO博客 本人注重原理分析,要求对其原理掌握,否则按教程操作,你怕是什么都学不会,仔细看,认真记比较好。 首先确认一下基本细节 1、路由…...

Linux高级--3.3.2.6高并发编程之“内存屏障”“CPU屏障”“编译屏障”

一、内存屏障 在 Linux C 语言编程 中,内存屏障(Memory Barrier) 是一种用于控制内存访问顺序的技术。它主要用于多处理器系统中,确保某些操作按预期顺序执行,避免 CPU 和编译器对内存访问进行优化,从而影…...

【含开题报告+文档+PPT+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现

开题报告 在全球范围内,安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会,人们面临的生活、工作环境日益复杂,交通事故、火灾、溺水、突发疾病等各种意外事件的发生概率…...

EMQX5.X版本性能配置调优参数

EMQX 主配置文件为 emqx.conf,根据安装方式其所在位置有所不同: 安装方式配置文件所在位置DEB 或 RPM 包安装/etc/emqx/emqx.confDocker 容器/opt/emqx/etc/emqx.conf解压缩包安装./etc/emqx.conf EMQ X 消息服务器默认占用的 TCP 端口包括: 端口 说明…...

电脑配置maven-3.6.1版本

不要使用太高的版本。 apache-maven-3.6.1-bin.zip 下载这个的maven压缩包 使用3.6.1版本。 解压缩放在本地软甲目录下面: 配置系统环境变量 在系统环境下面配置MAVEN_HOME 点击path 新增一条 在cmd中输入 mvn -v 检查maven的版本 配置阿里云镜像和本地的仓库 …...

水电站视频智能监控系统方案设计与技术应用方案

一、背景需求 水电站作为国家重要的能源基地,其安全运行对于保障能源供应和社会稳定具有重要意义。然而,传统的人工监控方式存在着诸多问题,如人力成本高、监控范围有限、反应不及时等。因此,水电站急需引进一种先进的视频智能监控…...

React 组件通信完整指南 以及 自定义事件发布订阅系统

React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…...

华为 AI Agent:企业内部管理的智能变革引擎(11/30)

一、华为 AI Agent 引领企业管理新潮流 在当今数字化飞速发展的时代&#xff0c;企业内部管理的高效性与智能化成为了决定企业竞争力的关键因素。华为&#xff0c;作为全球领先的科技巨头&#xff0c;其 AI Agent 技术在企业内部管理中的应用正掀起一场全新的变革浪潮。 AI Ag…...

【Pandas】pandas Series empty

Pandas2.2 Series Attributes 方法描述Series.index每个数据点的标签或索引Series.array对象底层的数据数组Series.values以NumPy数组的形式访问Series中的数据值Series.dtype用于获取 Pandas Series 中数据的类型&#xff08;dtype&#xff09;Series.shape用于获取 Pandas …...

Git如何设置和修改当前分支跟踪的上游分支

目录 前言 背景 设置当前分支跟踪的上游分支 当前分支已有关联&#xff0c;删除其关联&#xff0c;重新设置上游 常用的分支操作 参考资料 前言 仅做学习记录&#xff0c;侵删 背景 在项目开发过程中&#xff0c;从master新建分支时&#xff0c;会出现没有追踪的上游分…...

GitHub新手用法详解【适合新手入门-建议收藏!!!】

目录 什么是Github&#xff0c;为什么使用它&#xff1f; 一、GitHub账号的注册与登录 二、 gitbash安装详解 1.git bash的下载与安装 2.git常用命令 3. Git 和 GitHub 的绑定 1. 获取SSH keys 2.绑定ssh密钥 三、通过Git将代码提交到GitHub 1.克隆仓库 2.测试提交代码…...

游戏开发线性空间下PS工作流程

前言 使用基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui 在游戏引擎中的渲染结果与 PS 中的不一致&#xff1a; PS&#xff08;颜色空间默认是sRGB伽马空间&#xff09;&#xff1a…...

7-10 最长公共子序列

目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路&#xff1a; 详细代码&#xff1a; 题目描述 给出 1~n 的两个排列 P1 和 P2&#xff0c;求它们的最长公共子序列。 n 在 5~1000 之间。 输入格式: 第一行是一个数 n 接下来两行&#xff0c;每行为 n 个数&…...

亚远景-ISO 21434标准下的汽车网络安全:风险评估与管理的关键实践

ISO 21434标准&#xff0c;全称为ISO/SAE 21434 "Road Vehicles - Cybersecurity Engineering"&#xff0c;是国际标准化组织(ISO)发布的针对汽车领域的标准&#xff0c;旨在指导汽车制造商、供应商和相关利益相关方在汽车系统中应用适当的网络安全措施。在ISO 21434…...

C++ 的 source_location

1 __FILE__ 和 __LINE__ ​ 你一定看过这样的代码&#xff1a; printf("Internal error at \"%s\" on line %d.\n", __FILE__, __LINE__); 这行代码的作用就是打印出 printf() 函数调用发生时所在的源代码文件名&#xff08;包含路径&#xff09;和这行代…...

[python SQLAlchemy数据库操作入门]-14.实时数据采集 记录股市动态

哈喽,大家好,我是木头左! 要使用 SQLAlchemy 进行实时数据采集,首先需要搭建相应的开发环境。以下是所需的主要步骤: 安装 Python:确保你的系统上已经安装了 Python,推荐使用 Python 3.x 版本。创建虚拟环境:为了隔离项目依赖,建议为每个项目创建一个虚拟环境。可以使…...

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串&#xff1f;2、两个引号之间加上空格 好的&#xff0c;我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别&#xff0c;以及它们在 SQL 查询中的作用&#xff1a; 1. we_chat_union_id IS NOT NULL 含…...

【和春笋一起学C++】文本输入与读取

前言&#xff1a;前面学习了while语句后&#xff0c;下面用while语句实现一个重要的功能&#xff0c;逐字符的读取键盘输入的字符序列&#xff0c;并输出到显示屏上。 准备知识&#xff1a; C的输入输出包含以下3方面的内容&#xff1a; 对系统指定的标准设备的输入和输出。即…...

企微API集成指南——从回调到主动发送,全流程代码解析

企业微信提供了丰富的API&#xff0c;用于接收用户添加事件、发送消息、管理标签等。今天从实战角度&#xff0c;给出API集成的最佳实践&#xff0c;附带伪代码。一、核心API清单API用途频率限制获取access_token调用其他API的前提2000次/分钟添加外部联系人通过好友每个号300人…...

PyCharm+Conda环境避坑指南:手把手配置Real-ESRGAN,解决‘torch.cuda.is_available()‘报错和依赖冲突

PyCharmConda环境避坑指南&#xff1a;手把手配置Real-ESRGAN&#xff0c;解决‘torch.cuda.is_available()‘报错和依赖冲突 图像超分辨率技术正在改变我们处理低质量图像的方式&#xff0c;而Real-ESRGAN作为当前最先进的通用图像修复模型之一&#xff0c;其效果令人惊艳。但…...

抖音视频批量下载高效解决方案实战指南

抖音视频批量下载高效解决方案实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&…...

路由器、交换机、光猫有什么区别?网络设备基础入门

路由器、交换机、光猫有什么区别&#xff1f;网络设备基础入门前言一、光猫、路由器、交换机分别是干什么的二、三者最核心的区别到底是什么1.它是否直接面对运营商网络&#xff1f;2.它是否负责“让多台设备上网”&#xff1f;3.它是否主要用于扩展有线接口&#xff1f;三、先…...

python异常模拟工具类(异常生成工具类)

文章目录创建代码类使用主要是做测试的时候方便&#xff0c;创建代码类 1、新建python文件exception_mock_utils.py&#xff0c;代码为&#xff1a; import random import time from typing import Any, Optionalclass ExceptionMockUtils:"""异常模拟工具类用…...

Music Tag Web:智能音乐元数据管理工具解决音乐收藏混乱难题

Music Tag Web&#xff1a;智能音乐元数据管理工具解决音乐收藏混乱难题 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mu/…...

Performance-Fish:环世界性能优化的全方位解决方案

Performance-Fish&#xff1a;环世界性能优化的全方位解决方案 【免费下载链接】Performance-Fish Performance Mod for RimWorld 项目地址: https://gitcode.com/gh_mirrors/pe/Performance-Fish 问题诊断&#xff1a;环世界性能瓶颈深度剖析 &#x1f50d; AI决策系统…...

ESP8266高精度脉冲计数波形发生器库

1. 项目概述esp8266_waveformPulseCounter是一款面向 ESP8266 平台的高精度脉冲计数型波形发生器库&#xff0c;其核心设计目标是在硬件级精确控制下生成指定脉冲数量的方波/矩形波信号&#xff0c;并在计数完成时触发用户定义的回调动作。该库并非通用波形合成工具&#xff0c…...

多智能体框架MetaGPT:颠覆软件开发的效率革命

多智能体框架MetaGPT&#xff1a;颠覆软件开发的效率革命 【免费下载链接】MetaGPT &#x1f31f; The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming 项目地址: https://gitcode.com/GitHub_Trending/me/MetaGPT 在人工智能…...

探索MariaDB中的JSON处理

在数据库管理中,处理JSON数据逐渐变得重要,尤其是在需要从复杂的JSON结构中提取信息时。今天,我们将深入探讨如何在MariaDB中使用JSON_SEARCH函数来检查JSON对象中的布尔值true。通过实例,我们将展示如何使用此函数来简化查询过程。 JSON数据的结构 假设我们有一个JSON对…...