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

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

✍个人博客: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.mrgr.cn/news/24998.html

相关文章:

  • 【C++登堂入室】类与对象(上)
  • Python数据分析与可视化
  • python安装包的三种区别
  • 【文件包含】之日志文件注入
  • 稀土抗菌剂真的能抗菌吗?
  • 【习题】应用/元服务上架
  • JavaScript高级——函数的 prototype 属性
  • 本地部署大语言模型
  • 如何利用PowerShell脚本来自动化Windows开发流程(结合理论和实践)
  • 你不得不知的日志级别
  • 周也带你进阶OpenCV (1)--采样、直方图即均衡化、掩膜
  • VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程
  • Pai-Megatron-Patch:围绕Megatron-Core打造大模型训练加速生态
  • Python字典实战题目练习,巩固知识、检查技术
  • Cisco ISR 1000 IOS XE 17.15.1a 发布下载,新增功能概览
  • stm32 W25Q数据存储
  • 语法课第七节 结构体 类 指针 引用(知识点+题目)
  • 从零开始实现LoRA和DoRA:改进权重分解的低秩适应(DoRA)
  • 总听说数据治理,数据治理都包含什么?
  • 你做过自动化测试吗