span
std::span 是 C++20 引入的一个非常实用的特性,它提供了一个非拥有 (non-owning) 的、**连续内存区域的视图 (view)**。你可以把它理解为 std::string_view 的泛化版本,std::string_view 是 char 序列的非拥有视图,而 std::span 是任意类型 T 的序列的非拥有视图。 std::span 的核心思想和解决的问题在 C++20 之前,我们经常需要处理连续内存区域,例如: C 风格数组 (int arr[10];) std::vector std::array 其他自定义的连续内存容器 当我们需要将这些数据传递给函数时,通常有几种方式: 原始指针和长度: void func(int* data, size_t size); 这种方式容易出错,容易忘记传递长度,或者长度与实际数据不匹配,导致越界访问。 const std::vector<T>&: 如果函数只读取数据,这种方式比较安全。但如果函数只需要一部分数据,或者数据来源不是...
IPC通信
一、引言上班要用,临时抱佛脚学一下,引用进程间通信 IPC 完全指南:各种机制的原理与实战-腾讯云开发者社区-腾讯云 在现代计算系统中,多进程环境已经成为标准配置。随着计算需求的增长和应用复杂性的提升,单一进程往往无法独立完成所有任务。为了提高系统的灵活性、性能和可靠性,多个进程之间的协作成为了必然的选择。这就引出了一个关键问题:如何高效、安全地实现进程间的数据交换与通信?这就是进程间通信(Inter-Process...
mutex底层原理
std::mutex(互斥锁)是 C++ 中用于实现互斥访问共享资源的关键工具。它的底层原理涉及到操作系统、CPU硬件指令以及内存模型等多个层面。理解这些底层机制对于编写高效、正确的并发程序至关重要。 1. 为什么需要 Mutex?在多线程环境中,当多个线程尝试同时访问和修改同一个共享资源(如变量、数据结构、文件等)时,如果没有适当的同步机制,就可能发生**竞态条件 (Race Condition)**,导致数据损坏或程序行为不可预测。 示例: 12345678int counter = 0;void increment() { for (int i = 0; i < 100000; ++i) { counter++; // 这不是一个原子操作 }}// 两个线程同时调用 increment(),counter 的最终值可能不是 200000 counter++ 表面上是一行代码,但在 CPU 层面可能被分解为以下步骤: 读取 counter 的当前值到寄存器。 寄存器中的值加...
c++中的协程(一)
在学习协程之前,我们再重新回顾一下进程,线程 进程 (Process): 操作系统分配资源(内存、文件句柄等)的基本单位。每个进程有独立的地址空间。 线程 (Thread): CPU 调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的地址空间和资源。线程比进程更轻量级。 1. 内核线程 (Kernel Thread) 定义: 内核线程是由操作系统内核直接创建、管理和调度的线程。也就是我们说的LWP(轻量级进程),在linux系统中,内核线程和用户态线程是1:1的。 实现: 操作系统内核维护所有内核线程的上下文信息(如寄存器状态、栈指针等)。当需要进行线程切换时,内核会执行上下文切换。 调度: 由操作系统的调度器负责调度。调度器根据优先级、时间片等策略决定哪个线程在哪个 CPU 上运行。 开销: 创建/销毁: 创建和销毁内核线程的开销相对较大,因为它涉及到系统调用和内核数据结构的操作。 上下文切换: 上下文切换的开销也相对较大,因为它需要保存和恢复大量的寄存器信息,并且可能涉及到 TLB (Translation Lookaside Buffer)...
enum和enum class
一、 enum (传统枚举 / Unscoped Enum)enum 是 C 语言就有的特性,在 C++ 中也得到了支持。它定义了一组具名的整数常量。 特点: 作用域污染 (Scope Pollution): enum 的枚举器(即具名常量)会泄露到定义它们的命名空间或全局作用域中。这意味着你不能在同一个作用域中定义同名的枚举器,即使它们属于不同的 enum 类型。 123456enum Color { RED, GREEN, BLUE };enum TrafficLight { RED_LIGHT, YELLOW_LIGHT, GREEN_LIGHT }; // 编译错误:RED_LIGHT 与 Color::RED 冲突 (如果 RED_LIGHT 也叫 RED) // 实际上这里不会冲突,因为名字不同。但如果 TrafficLight 也有一个叫 RED 的枚举器,就会冲突。// 假设:// enum...
Untitled
千秋伟业强国路,勇担重任绽芳华——社会实践报告引言党的二十大报告擘画了以中国式现代化全面推进中华民族伟大复兴的宏伟蓝图,强调了科技创新在国家发展中的核心地位,并对青年一代寄予厚望。在实现中华民族伟大复兴的“千秋伟业强国路”上,我们青年学子理应“勇担重任绽芳华”,将个人理想融入国家发展大局,以实际行动践行青春使命。为深入理解国家战略,将所学知识应用于基层实践,我积极参与了以“智慧赋能乡村振兴”为主题的暑期社会实践活动。本次实践旨在通过科技手段助力乡村发展,亲身体验强国建设的伟大进程,并从中汲取成长的力量。 一、实践目的本次社会实践活动,我怀揣着多重目的与期望: 响应国家战略,深化理论认知: 党的十八大以来,以习近平同志为核心的党中央高度重视“三农”工作,提出乡村振兴战略。通过亲身参与,我希望能够深入了解乡村振兴的内涵、挑战与机遇,将书本上的理论知识与国家政策在实践中进行印证和深化,理解科技赋能乡村的现实意义和长远价值,从而更好地把握新时代强国建设的脉搏。 学以致用,提升专业技能:...
分支预测
说实话,我是怎么也没想到这玩意可以被放到面试题合集里面,但是凯读的笔试考了,真服了 一、 分支预测 (Branch Prediction)1. 什么是分支预测?分支预测是现代微处理器(CPU)中的一项关键技术,用于优化指令流水线(Instruction Pipeline)的效率。简单来说,当CPU遇到一个条件分支(例如 if-else 语句、switch 语句、循环等)时,它需要决定接下来执行哪条路径的指令。然而,CPU无法立即知道条件判断的结果,如果等待判断结果出来再取下一条指令,就会导致流水线停顿,浪费大量时间。 为了避免这种停顿,CPU会猜测哪个分支会被执行,并提前获取并处理该分支上的指令。这就是分支预测。 2. 为什么需要分支预测?现代CPU采用指令流水线技术,将指令的执行过程分解为多个阶段(如取指、译码、执行、访存、写回),并让多个指令在不同阶段并行执行,就像工厂的流水线一样。这大大提高了CPU的吞吐量。 然而,当遇到条件分支时,流水线的执行会遇到挑战: 取指阶段需要知道下一条指令的地址。 如果下一条指令的地址取决于一个尚未计算出的条件(例如 if (x >...
结构化绑定
结构化绑定 (Structured Bindings) (C++17)结构化绑定是 C++17 引入的一项语法糖,它允许你将一个复合类型(如数组、结构体、类、std::pair、std::tuple 等)的成员或元素解构到独立的变量中,而无需显式地访问每个成员。这极大地简化了从复合类型中提取数据的代码,提高了可读性。 核心思想:结构化绑定的目标是让代码更简洁、更富有表现力,尤其是在处理返回多个值的函数、遍历 std::map 或处理复杂数据结构时。它本质上是编译器生成的一些代码,将复合类型的值绑定到一系列新的变量上。 语法:[[attributes]] decl_specifier_seq ref_binding = expression; decl_specifier_seq: 类型说明符序列,通常是 auto 或 const auto 等。 ref_binding: 绑定列表,形如 [e1, e2, e3, ...],其中 e1, e2, ... 是你要声明的新变量名。 expression:...
optional
std::optional (C++17)std::optional 是 C++17 标准库中引入的一个模板类,用于表示一个可能包含值,也可能不包含值的对象。它解决了在 C++ 中处理“值可能缺失”这一常见问题。 核心思想:在很多情况下,一个函数可能无法返回一个有效的结果,或者一个变量可能暂时没有被初始化。传统的 C++ 做法通常有: 返回特殊值: 例如,返回 nullptr(对于指针)、-1 或 0(对于整数),但这要求调用者记住这些特殊值,并且这些特殊值可能与有效值冲突。 抛出异常: 这会引入额外的开销,并且异常通常用于表示程序中的错误,而不是常规的“值缺失”状态。 通过输出参数: 函数通过引用参数来返回结果,并返回一个 bool 值表示是否成功。这使得函数签名复杂,并且不符合函数式编程的风格。 std::optional 提供了一种类型安全、明确且惯用的方式来表达这种“可选值”的概念,类似于其他语言中的 Maybe 或 Option 类型。 特点: 值或无值: optional 对象要么包含一个 T 类型的值,要么不包含任何值(处于“空”状态)。 内存开销小:...
if contexpr和decltype
1. if constexpr (C++17)if constexpr 是 C++17 引入的一种编译期条件语句。它与普通的 if 语句不同,普通的 if 语句是在运行时评估条件,并根据结果执行相应的代码块。而 if constexpr 的条件必须是一个常量表达式,并且在编译时进行评估。 核心思想:if constexpr 的主要目的是在编译时根据条件选择性地编译代码路径。这意味着不满足条件的 if constexpr 分支在编译时会被完全丢弃,不会参与到最终的可执行文件中。这对于模板编程来说非常有用,因为它允许我们根据模板参数的特性(例如,是否是某个类型,是否支持某个操作)来生成不同的代码。 语法:if constexpr (constant_expression) 为什么需要 if constexpr?在 C++17 之前,为了实现编译期条件选择,我们通常需要使用模板特化、SFINAE (Substitution Failure Is Not An Error) 或标签分发等技术,这些方法往往比较复杂和冗长。if constexpr...




