C++学习(十)(标准,C++11 和 C++14,C++17,C++20)
C++ 标准
C++ 标准是一组定义语言功能、语法和语义的规则和准则。国际标准化组织 (ISO) 负责维护和更新 C++ 标准。这些标准的主要目的是确保跨多个平台和编译器的一致性、效率和可维护性。
以下是迄今为止发布的不同 C++ 标准的简要摘要:
-
C++98/C++03:C++ 的第一个标准化版本,引入了许多功能,如模板、异常和标准模板库 (STL)。C++03 是对 C++98 的次要更新,修复了一些错误并改进了性能。
-
C++11:对语言的重大升级,引入了以下功能:
- Lambda 表达式:
auto sum = [](int a, int b) -> int { return a + b; };- 基于范围的 for 循环:
std::vector<int> numbers = {1, 2, 3, 4}; for (int num : numbers) {std::cout << num << std::endl; }- 智能指针(如 和 )。
std::shared_ptrstd::unique_ptr
-
C++14:对 C++11 进行了一次次要更新,其中添加了如下功能:
- 通用 lambda 表达式:
auto generic_sum = [](auto a, auto b) { return a + b; };- 二进制文本:
int binary_number = 0b1010; -
C++17:另一个重大更新,引入了如下功能:
if和初始值设定项:switch
if (auto it = my_map.find(key); it != my_map.end()) {// use 'it' here }- 结构化绑定:
std::map<std::string, int> my_map = {{"A", 1}, {"B", 2}}; for (const auto& [key, value] : my_map) {// use 'key' and 'value' here } -
C++20:该语言的最新重大更新,具有以下功能:
- 概念:
template<typename T> concept Addable = requires(T a, T b) {{ a + b } -> std::same_as<T>; };- 范围:
std::vector<int> numbers = {1, 2, 3, 4}; auto doubled = numbers | std::views::transform([](int n) { return n * 2; });- 协程等。
请记住,要使用这些语言功能,您可能需要将编译器配置为使用特定的 C++ 标准版本。例如,对于 GCC 或 Clang,您可以使用 、 、 或 标志。-std=c++11-std=c++14-std=c++17-std=c++20
C++11 和 C++14
C++11C++11 标准,也称为 C++0x,于 2011 年 9 月正式发布。它引入了几项新的语言功能和改进,包括:
-
Auto:允许编译器根据变量的初始化表达式推断变量类型。
auto integer = 42; // integer is of int type auto floating = 3.14; // floating is of double type -
基于范围的 for 循环:提供类似于 foreach 的语义,用于迭代容器或数组。
std::vector<int> numbers {1, 2, 3, 4}; for (int number : numbers) {std::cout << number << std::endl; } -
Lambda 函数:允许更轻松地创建函数对象的匿名函数。
auto add = [](int a, int b) -> int { return a + b; }; int sum = add(42, 13); // sum is equal to 55 -
nullptr:一个表示 null 指针的新关键字,比使用文本 '0' 或 “NULL” 更类型安全。
int *ptr = nullptr; -
线程支持库:提供一种使用线程和跨线程同步数据访问的标准方法。
std::thread t([]() { std::cout << "Hello from another thread\n"; }); t.join();
C++14C++14 标准于 2014 年 12 月正式发布,作为 C++11 的小型扩展,更侧重于微调语言功能和修复问题。引入的一些新功能:
-
通用 Lambda:允许使用 'auto' 类型占位符声明 lambda 函数参数。
auto add = [](auto a, auto b) { return a + b; }; auto sum_i = add(42, 13); // Still works with integers auto sum_f = add(3.14, 2.72); // Now works with doubles too -
Binary Literals(二进制文本):允许您将整数作为二进制文本输入,以提高可读性。
int b = 0b110101; // Decimal value is 53 -
decltype(auto):推导变量的类型以匹配初始化变量时使用的表达式的类型。
auto func = [](auto a, auto b) { return a * b; }; decltype(auto) result = func(5, 3.14); // decltype(auto) deduces to "double" -
变量模板:允许您使用模板参数定义变量。
template <typename T> constexpr T pi = T(3.1415926535897932385); float r = pi<float>; // Instantiated as a float double d = pi<double>; // Instantiated as a double
C++20
C++20 是 C++ 编程语言的最新标准,它为语言带来了重大改进和新功能。此版本旨在促进更好的软件开发实践,并使开发人员能够编写更高效、可读和可维护的代码。
以下是 C++20 中引入的一些关键功能:
概念
概念是一种对模板参数强制实施特定要求的方法,允许您编写更具表现力和可理解性的代码。它们改进了使用模板时的错误消息,并确保模板参数满足特定条件。
template <typename T>
concept Addable = requires (T a, T b) {{ a + b } -> std::same_as<T>;
};template <Addable T>
T add(T a, T b) {return a + b;
}
范围
范围提供了一种处理值序列的新方法,增强了标准库算法的功能和表现力。基于范围的算法使使用序列变得更加容易和方便。
#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>int main() {std::vector<int> numbers = { 1, 2, 3, 4, 5 };auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });for (int n : even_numbers) {std::cout << n << ' ';}
}
协程
协程是一种编写异步和并发代码的新方法,具有更高的可读性。它们允许暂停和恢复函数,使您能够编写更高效、无阻塞的代码。
#include <coroutine>
#include <iostream>
#include <future>std::future<int> async_value(int value) {co_await std::chrono::seconds(1);co_return value * 2;
}int main() {auto result = async_value(42);std::cout << "Result: " << result.get() << std::endl;
}
我们可以用**“定时烹饪任务”**的比喻来理解这段代码的异步协程机制:
代码拆解
1. 创建定时烹饪任务(协程函数)
std::future<int> async_value(int value) {co_await std::chrono::seconds(1); // 暂停1秒(定时器)co_return value * 2; // 返回结果(完成烹饪)
}
-
co_await:
像给厨房设定一个定时器,在等待的1秒钟里,厨师(主线程)可以去做其他事情(不阻塞)。 -
co_return:
定时器响后,自动继续执行,返回加工后的结果(把原料value翻倍)。
2. 启动任务并获取结果
int main() {auto result = async_value(42); // 开始烹饪(启动协程)std::cout << "Result: " << result.get() << std::endl; // 等待结果
}
-
result.get():
相当于等待厨师完成烹饪,如果结果还没准备好(定时未到),主线程会在这里暂停等待。
类比场景
想象你让智能厨房做菜:
-
下达指令:
async_value(42)相当于说:“把42克食材处理一下,1小时后给我结果”。 -
异步等待:
厨房定时器开始倒计时,你可以去刷手机(主线程不阻塞)。 -
获取结果:
1小时后,你调用result.get()取回加工好的84克成品。
关键知识点
| 代码部分 | 作用 | 类比 |
|---|---|---|
std::future<int> | 表示未来将获得一个整数结果 | 烹饪订单凭据 |
co_await | 暂停协程,让出线程资源 | 设定厨房定时器 |
co_return | 协程完成时返回结果 | 厨师交付成品 |
result.get() | 阻塞等待结果 | 等待厨师完成 |
实际执行流程
-
调用
async_value(42)启动协程:-
遇到
co_await→ 暂停协程,启动1秒定时器。 -
立刻返回
future对象(此时结果尚未准备好)。
-
-
主线程执行
result.get():-
如果1秒未到 → 主线程阻塞等待。
-
1秒后定时器触发 → 协程恢复,计算
42*2=84并存入future。 -
主线程获得结果,输出
Result: 84。
-
注意事项
-
协程依赖:需要 C++20 或更高标准,且编译器支持协程(如 GCC11+/Clang14+)。
-
不完全是多线程:协程的暂停/恢复在单线程内也可实现(本例通过定时器演示异步,实际可能涉及线程池)。
-
错误处理:真实场景需处理协程中可能的异常(本例未展示)。
一句话总结
这段代码像**“智能厨房点单”**——主线程下单后继续干活,协程默默计时处理,最后交付结果,高效利用等待时间! 🕒👨🍳
和 关键字constexpr consteval
和 都与编译时评估有关。标记为 的函数可以在编译时或运行时执行,而标记为 的函数只能在编译时执行。constexpr consteval constexpr consteval
constexpr int add(int a, int b) {return a + b;
}consteval int square(int x) {return x * x;
}int main() {constexpr int result1 = add(3, 4); // evaluated at compile-timeint result2 = add(5, 6); // evaluated at runtimeconstexpr int result3 = square(7); // evaluated at compile-time
}
这些只是 C++20 标准的一些亮点。它还包括许多其他功能和改进,例如结构化绑定、改进的 lambda 和新的标准库组件。总体而言,C++20 使开发人员能够更轻松地编写干净、高效且富有表现力的代码。
我们可以用**“建筑设计”和“施工阶段”**的比喻来理解这两个关键字:
核心区别
| 关键字 | 作用阶段 | 比喻 | 灵活性 |
|---|---|---|---|
constexpr | 编译时 或 运行时 | 设计蓝图(可调整) | 灵活,能适应不同阶段 |
consteval | 仅编译时 | 设计规范(必须确定) | 严格,仅设计阶段 |
详细解释
1. constexpr(灵活的双面手)
-
功能:可以用于编译时计算,也可以在运行时当普通函数调用。
-
场景:
-
编译时:比如计算数组长度、模板参数等需要提前确定的值。
-
运行时:当输入参数只能在运行时确定时,自动降级为普通函数。
-
代码示例:
constexpr int 平方(int x) {return x * x;
}int main() {constexpr int a = 平方(5); // 编译时计算(设计阶段确定)int b = 平方(10); // 运行时计算(施工阶段执行)
}
2. consteval(严格的编译时警察)
-
功能:强制函数必须在编译时执行,否则直接报错。
-
场景:
-
必须确保某个值在编译时确定(如模板元编程中的常量)。
-
避免运行时开销,确保优化。
-
代码示例:
consteval int 立方(int x) {return x * x * x;
}int main() {constexpr int a = 立方(3); // 合法(编译时计算)int b = 立方(5); // ❌ 编译错误(不能在运行时调用!)
}
对比场景
假设你是一个建筑师:
-
constexpr像可调节的蓝图工具:-
可以在设计阶段(编译时)计算房间面积。
-
也可以在施工时(运行时)根据现场测量临时计算。
-
-
consteval像严格的设计规范检查器:-
必须在设计阶段确定所有参数(如承重墙位置)。
-
施工阶段不允许临时修改,否则直接停工!
-
为什么需要 consteval?
-
安全强制:确保某些关键计算(如加密密钥生成)不会泄露到运行时。
-
优化保证:编译时计算的结果可直接内联,提升性能。
-
错误前置:在编译阶段发现问题,避免运行时崩溃。
一句话总结
-
constexpr:灵活多面手,编译时和运行时都能干活。 -
consteval:严格检查员,只允许编译时干活! 🔧⚡
相关文章:
C++学习(十)(标准,C++11 和 C++14,C++17,C++20)
C 标准 C 标准是一组定义语言功能、语法和语义的规则和准则。国际标准化组织 (ISO) 负责维护和更新 C 标准。这些标准的主要目的是确保跨多个平台和编译器的一致性、效率和可维护性。 以下是迄今为止发布的不同 C 标准的简要摘要: C98/C03&…...
动态内存管理的了解及使用
目录 1.什么是动态内存? 2.为什么要使用动态内存分配空间? 3.动态内存开辟函数malloc,calloc,realloc 3.1 malloc 3.2 calloc 3.3 realloc 3.4 头文件包含 4.动态内存释放函数free 5.动态内存的基本常见错误 5.1 对NULL…...
大模型推理显存优化:从KV Cache压缩到量化策略实战
引言:显存瓶颈的困境 随着ChatGPT等大语言模型的广泛应用,模型推理过程中的显存占用问题日益凸显。以典型的Llama2-13B模型为例,单次推理就需要占用超过6GB显存,严重制约了服务吞吐量和硬件利用率。本文将深入探讨大模型推理中的…...
pom.xml配置(mybatisplus增删改查实现;PageInfo分页实现;JSONObject实现)
一、mybatisplus增删改查实现 pom.xml <!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency>在mapper文件里…...
File文件和目录
一、文件和目录相关概念 计算机文件(File):以计算机硬盘为载体存储在计算机上的信息集合,可以是文本(.txt)、图片(.jpg、.png、.jpeg)、视频(.mp4)、程序(.exe)等,文件一般有拓展名,表示文件的类型。 文件…...
【运维笔记】Navicat中删除mongo 某个时间之前的数据
【运维笔记】Navicat中删除mongo 某个时间之前的数据 一、场景与需求1.1、场景1.2、需求 二、解决方案三、实战3.1、【Navicat】使用sql语句 (推荐)Step 1:使用查询窗口 - 查询Step 2:确认第一步的数据是否是需要删除的数据Step 3…...
BUUCTF逆向刷题笔记(1-12)
easyre、内涵的软件、xor、不一样的flag: buuctf reverse部分题解(实时更新)_reverse 题解-CSDN博客 请见小库里的blog。 reverse1 查壳发现没有,而且是64位 粗略改一下部分函数名,看看主要逻辑。 第一个for循环暂…...
如何改变怂怂懦弱的气质(2)
你是否曾经因为害怕失败而逃避选择?是否因为不敢拒绝别人而让自己陷入困境?是否因为过于友善而被人轻视?如果你也曾为这些问题困扰,那么今天的博客就是为你准备的。我们将从行动、拒绝、自我认知、实力提升等多个角度,…...
【DeepSeek】5分钟快速实现本地化部署教程
一、快捷部署 (1)下载ds大模型安装助手,下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe (2)打开软件,点击立即激活 (3)选…...
算法之二维装水问题
目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水 比如,arr {3,1,2,5,2,…...
[C语言日寄] 字符串操作函数的使用及其拓展
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
用Python的Pandas库解锁数据科学:从入门到实战
用Python的Pandas库解锁数据科学:从入门到实战 引言 Python的Pandas库(名称源自"Panel Data")作为数据科学生态系统的基石,凭借其强大的数据结构和灵活的操作功能,已成为全球超过90%数据工作者的首选工具。…...
利率债、信用债、可转债区别与优势
利率债、信用债、城投债和可转债是债券市场的主要品种,它们在发行主体、风险收益特征和投资优势上各有不同。以下是它们的区别和优势: 1. 利率债 定义:利率债是由政府或政府支持的机构发行的债券,主要包括国债、政策性金融债&…...
12、Vue 生命周期各阶段及任务
Vue 2 生命周期各阶段及任务 创建阶段 beforeCreate 此时实例刚刚初始化,数据观测(data)和 event/watcher 事件配置还未开始。通常在此阶段无法访问 data 中的数据和 methods 中的方法。可以进行一些与 Vue 实例无关的全局初始化操作&#x…...
AI进化太快,建立完善的AI理论迫在眉睫
如今的AI用日新月异来形容都毫不夸张。DeepSeek的热度还没降,Manus 又火了。随着AI越来越强大且进化速度越来越快,建立完善的AI理论迫在眉睫。 虽然AI是人类创造的,但是我们其实没有完全理解其原理。深度学习本质上还是一个黑盒,…...
MATLAB程序介绍,三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波
本文所述的MATLAB代码为三维的交互式多模型(IMM)滤波器,结合了匀速直线运动(CV模型)和匀速圆周运动(CT模型)的状态估计。使用扩展卡尔曼滤波(EKF)来处理状态更新与观测数…...
[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑
参考原文:[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗?是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱?现在,这些问题通通能解决!Deskflow 软件闪亮登…...
【leetcode hot 100 48】旋转图像
方法一:(原地旋转)对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。matrix[row][col]在旋转后的新位置为matrix[col][n−row−1]。只要旋转四次就能回到原点。 class Solution {public vo…...
K8S高可用集群-小白学习之二进制部署(ansible+shell)
一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…...
【哇! C++】类和对象(三) - 构造函数和析构函数
目录 一、构造函数 1.1 构造函数的引入 1.2 构造函数的定义和语法 1.2.1 无参构造函数: 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有,简称为空类。 空类中…...
利用Ollama+AnythingLLM+本地向量数据库Milvus+本地DeepSeek大模型实现知识库的搭建
1. Ollama的搭建 基本介绍 Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen模型等。用户只需一行命令就可以启动模型。 Ollama 下载:https://ollama.com/download Ollama 官方主页&a…...
攻防世界WEB(新手模式)19-file_include
先进行代码分析 include("./check.php");:包含并执行当前目录下的check.php文件,通常用于引入一些通用的函数、类或配置信息。if(isset($_GET[filename])):检查是否通过 GET 请求传递了名为filename的参数。如果传递了filename参数…...
Facebook 的隐私保护数据存储方案研究
Facebook 的隐私保护数据存储方案研究 在这个信息爆炸的时代,数据隐私保护已成为公众关注的热点。Facebook,作为全球最大的社交媒体平台之一,承载着海量用户数据,其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深…...
app UI自动化测试框架都包含哪些内容?
UI自动化测试框架是指用于自动化执行用户界面(UI)相关测试的工具和库。它们可以帮助开发团队提高测试效率、发现和解决应用程序中的问题,并确保应用程序的正确性和稳定性。下面将详细介绍一个完整的UI自动化测试框架应该具备的内容。 1. 测试环境配置 UI自动化测试框…...
C++ 中 `shared_ptr` 的用法及常见陷阱解析
shared_ptr 是 C 标准库(<memory> 头文件)中提供的一种智能指针,用于管理动态分配的内存。它通过引用计数(reference counting)来实现多个 shared_ptr 对象共享同一块内存的所有权。当最后一个 shared_ptr 被销毁…...
Android+SpringBoot的老年人健康饮食小程序平台
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手,详细阐述居家养老管理模式兴起的…...
ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...
视频格式有哪些视频格式汇总
视频格式是指视频文件的编码和封装方式,不同的格式适用于不同的应用场景。以下是一些常见的视频格式及其特点: 1. MP4(MPEG-4 Part 14) 特点:最流行的视频格式之一,支持多种视频编码标准(如H.…...
【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
https://time.geekbang.org/column/article/118826 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的? 2.5介绍了渲染流水线中的 DOM 生成、样式计算和布局三个阶段,2.6讲解渲染流水线后面的阶段…...
浏览器WEB播放RTSP
注意:浏览器不能直接播放RTSP,必须转换后才能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...
