【C++ 面试 - 新特性】每日 3 题(十一)

news2024/11/23 15:44:06

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

31. 模块

从 C 语言中,C++ 继承了 #include 机制,依赖从头文件使用文本形式包含 C++ 源代码,这些头文件中包含了接口的文本定义。一个流行的头文件可以在大型程序的各个单独编译的部分中被 #include 数百次。基本问题是:

(1) 不够卫生:一个头文件中的代码可能会影响同一翻译单元中包含的另一个 #include 中的代码的含义,因此 #include 并非顺序无关。宏是这里的一个主要问题,尽管不是唯一的问题。

(2) 分离编译的不一致性:两个翻译单元中同一实体的声明可能不一致,但并非所有此类错误都被编译器或链接器捕获。

(3) 编译次数过多:从源代码文本编译接口比较慢。从源代码文本反复地编译同一份接口非常慢。

所以,在 C++ 程序中改进模块化是一个迫切的需求。

#include <iostream>
int main() {
    std::cout << "Hello, C++!" << std::endl;
}

这段标准代码有 70 个左右的字符,但是在 #include 之后,它会产生 419909 个字符需要编译器来消化。尽管现代 C++ 编译器已有傲人的处理速度,但模块化问题已经迫在眉睫。

模块化是什么意思?顺序独立性:import X; import Y; 应该与 import Y; import X; 相同。

换句话说,任何东西都不能隐式地从一个模块“泄漏”到另一个模块。
这是 #include 文件的一个关键问题。

#include 中的任何内容都会影响所有后续的 #include。

顺序独立性是“代码卫生”和性能的关键。

C++ 20 中正式引入了模块的概念,模块是一个用于在翻译单元间分享声明和定义的语言特性。它们可以在某些地方替代使用头文件。

其主要优点如下:

  1. 没有头文件。
  2. 声明实现仍然可分离,但非必要。
  3. 可以显式指定导出哪些类或函数。
  4. 不需要头文件重复引入宏(include guards)。
  5. 模块之间名称可以相同,并且不会冲突。
  6. 模块只处理一次,编译更快(头文件每次引入都需要处理,需要通过 pragma once 约束)。
  7. 预处理宏只在模块内有效。
  8. 模块的引入与引入顺序无关。

创建模块

源文件->添加->新建项->Module

创建 ***.ixx 文件

//创建模块 
// mymodule.ixx //模块名和文件名没有强制要求,一般会相同
export module helloworld; //模块声明
import <iostream>; //导入声明 注意;号
export void hello() { //导出声明
    std::cout << "Hello world!\n";
}

//导入模块
//main.cpp
import helloworld; //导入声明
int main() {
    hello();
}

32. 协程

协程就是一个可以挂起(suspend)和恢复(resume)的函数(不能是 main 函数)。你可以暂停协程的执行, 去做其他事情,然后在适当的时候恢复到暂停的位置继续执行。协程让我们使用同步方式写异步代码。

C++ 提供了三个方法挂起协程:co_await, co_yield 和 co_return。

C++20 协程只是提供协程机制,而不是提供协程库。C++20 的协程是无栈协程,无栈协程是一个可以挂起/恢复的特殊函数,是函数调用的泛化,且只能被线程调用,本身并不抢占内核调度。

C++20 提供了三个新关键字 (co_await、co_yield 和 co_return),如果一个函数中存在这三个关键字之一,那么它就是一个协程。

co_yield some_value:保存当前协程的执行状态并挂起,返回 some_value 给调用者。

co_await some_awaitable:如果 some_awaitable 没有 ready,就保存当前协程的执行状态并挂起。

co_return some_value:彻底结束当前协程,返回 some_value 给协程调用者。

应用场景

定时器
在这里插入图片描述

33. <=> 三向比较运算符

也叫三路比较运算符,三路比较结果如下:

  • (a <=> b) < 0 // 如果 a < b,则为 true
  • (a <=> b) > 0 // 如果 a > b,则为 true
  • (a <=> b) == 0 // 如果 a 与 b 相等或者等价,则为 true

类似于 C 的 strcmp 函数返回 -1, 0, 1。

一般情况:自动生成所有的比较操作符,如果对象是结构体则逐个比较,可以用下面代码代替所有的比较运算符:

auto X::operator<=>(const Y&) = default;

高级情况:指定返回类型(支持 6 种所有的比较运算符)

int num1 = 100, num2 = 100;
if ((num1 <=> num2) < 0) {
    cout << "num1 < num2" << endl;
}
else if ((num1 <=> num2) > 0) {
    cout << "num1 > num2" << endl;
}
else {
    cout << "num1 = num2" << endl;
}

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

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

相关文章

电容器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

在当今全球制造业的数字化转型浪潮中&#xff0c;电容器制造业作为电子元件的关键领域&#xff0c;正积极拥抱5G智能工厂与物联数字孪生平台技术&#xff0c;以推动生产效率的飞跃和产品质量的提升。这一创新模式不仅为电容器制造业注入了新的活力&#xff0c;也为整个制造业的…

植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48

摘要 三萜皂苷(triterpenoids saponins)是由三萜皂苷元和一个或多个糖基和/或其他化学基团缩合而成的一系列结构多样的天然化合物[1], 主要分布在五加科、蝶形花科、石竹科、桔梗科、毛茛科、玄参科、葫芦科等植物中[2]. 植物中三萜皂苷常分布在特定的器官和组织, 如人参(Pana…

TypeScript中 unknown类型的变量值赋值给具体类型的变量

将unknown类型分配给string类型&#xff0c;但我就想给y 赋值&#xff0c;提供了几个方法 // unknown 是类型安全的any let x : unknown; x 1; x true; x sdfj;let y : string; // y x;//不能将unknown类型分配给string类型&#xff0c;但我就想给y 赋值 &#xff0c;下方…

Matlab如何配置小波工具(Wavelet Toolbox)

1、发现问题 因为实验要使用小波工具函数&#xff0c;运行时报错如下&#xff1a; 查看对应文件夹发现没有小波工具&#xff08;也可在控制台输入ver&#xff09;&#xff0c;检查是否有该工具&#xff0c;输入后回车返回如下&#xff1a; 2、下载工具包 没有这个工具就要去下…

信息安全数学基础(8)整数分解

前言 在信息安全数学基础中&#xff0c;整数分解是一个核心概念&#xff0c;它指的是将一个正整数表示为几个正整数的乘积的形式。虽然对于任何正整数&#xff0c;理论上都可以进行分解&#xff08;除了1只能分解为1本身&#xff09;&#xff0c;但整数分解在密码学和信息安全中…

机器学习:逻辑回归--过采样

目录 前言 一、为什么使用过采样&#xff1f; 二、代码实现 1.完整代码 2.数据预处理 3.进行过采样 4.建立模型 5.绘制混淆矩阵 总结 前言 过采样&#xff08;Oversampling&#xff09;是指在数据处理或机器学习中&#xff0c;增加少数类样本的数量以平衡类别分布。常…

JMM 指令重排 volatile happens-before

在单线程程序中&#xff0c;操作系统会通过编译器优化重排序、指令级并行重排序、内存系统重排序三个步骤对源代码进行指令重排&#xff0c;提高代码执行的性能。 但是在多线程情况下&#xff0c;操作系统“盲目” 地进行指令重排可能会导致我们不想看到的问题&#xff0c;如经…

Android Tools | 如何使用Draw.io助力Android开发:从UI设计到流程优化

Android Tools | 如何使用Draw.io助力Android开发&#xff1a;从UI设计到流程优化 1. 引言 在Android开发中&#xff0c;视觉化设计与流程管理至关重要。虽然开发工具如Android Studio强大&#xff0c;但它并不适用于所有设计场景。Draw.io是一款免费的在线绘图工具&#xff…

黑马头条第八天实战(上)

D8 1&#xff09;登录功能需求说明 用户根据用户名和密码登录密码需要手动加盐验证需要返回用户的token和用户信息 2&#xff09;模块搭建思路步骤 2.1&#xff09;模块作用 先捋一下之前搭模块干了啥 feign-api 远程调用 自媒体保存时调用远程客户端进行增加文章&#x…

UE5中使用UTexture2D进行纹理绘制

在UE中有时需要在CPU阶段操作像素&#xff0c;生成纹理贴图等&#xff0c;此时可以通过UTexture2D来进行处理&#xff0c;例子如下&#xff1a; 1.CPP部分 首先创建一个蓝图函数库&#xff0c;将UTexture2D的绘制逻辑封装成单个函数&#xff1a; .h&#xff1a; #include &…

文本转语音工具 ChatTTS 使用教程

文章目录 Part.I IntroductionPart.II 一键安装部署Chap.I 下载Chap.II 使用Chap.III 存在的问题 Part.III 手动部署Chap.I 快速使用Chap.II 开发教程 Reference Part.I Introduction ChatTTS (Chat Text To Speech) 是专门为对话场景设计的文本转语音模型&#xff0c;例如LLM…

arcgisPro添加属性域

1、创建一个面要素&#xff0c;结果如下&#xff1a; 2、在【内容】列表中&#xff0c;选中该要素&#xff0c;点击【数据】选项卡&#xff0c;如下&#xff1a; 3、点击【属性域】按钮&#xff0c;如下&#xff1a; 4、点击【新建域】 5、添加一行属性域&#xff0c;如 6、保存…

【生日视频制作】海底石碑雕刻AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程海底石碑雕刻AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】海底石碑雕刻AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件…

python 注册 Nacos

根据项目需要 将python服务也纳入Nacos 中进行统一管理&#xff0c;所以进行python Nacos 项目适配。 记录本此适配过程。 python 安装不在说明。 系统版本&#xff1a;Linux 5.4.18-87.76-generic KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/L…

文心一言 VS 讯飞星火 VS chatgpt (345)-- 算法导论23.2 4题

四、假定图中的边权重全部为整数&#xff0c;且在范围 1 ∼ ∣ V ∣ 1 \sim |V| 1∼∣V∣内。在此种情况下&#xff0c;Kruskal算法最快能多快&#xff1f;如果边的权重取值范围在1到某个常数 W W W之间呢&#xff1f;如果要写代码&#xff0c;请用go语言。 文心一言&#xff…

RPY角的具体描述

目录 一、 RPY角度 二、左乘与右乘 三、xyz固定角和zyx欧拉角旋转矩阵等价 四、参考文献 一、 RPY角度 1.1、X-Y-Z固定角[1] 首先将坐标系{B}和一个已知参考坐标系{A}重合。先将{B}绕旋转γ角&#xff0c;在绕旋转β角&#xff0c;在绕旋转α角&#xff0c;每次旋…

做统计(蓝桥杯初级)

系列文章目录 e&#xff0c;新系列没有目录&#xff09; 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入输入样例&#xff1a; 2.输出输出样例&#xff1a; 3.代码示例 四、思路总结 前言 今天我们来做《做统计》 一、个人名片 个人主页&…

Flutter-底部选择弹窗(showModalBottomSheet)

前言 现在有个需求&#xff0c;需要用底部弹窗来添加定时的重复。在这里使用原生的showModalBottomSheet来实现 showModalBottomSheet的Props 名称 描述 isScrollControlled全屏还是半屏isDismissible外部是否可以点击&#xff0c;false不可以点击&#xff0c;true可以点击&a…

剪花布条(KPM模板题)

思路&#xff1a;套用KMP模板即可。 #include<bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define endl \n int ne[200005]; int main() {IOSstring a,b;while(cin >> a){if(a"#") break;cin …

LEAN 类型系统属性 之 算法式相等的非传递性(Algorithm equality is not transitive)注解

由于 subsingleton 使用函数&#xff08;eliminator&#xff09; 的存在&#xff0c;导致算法式相等&#xff08;Algorithm defintional equality&#xff09;的非传递性。 在《定义上相等的非确定性&#xff08;Undecidability of Definitional Equality&#xff09;》 中有&…