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...
varient与any
1. std::variant (变体)std::variant 是一个类型安全的联合体 (union)。它可以在编译时定义一个固定且有限的类型集合,并在运行时精确地持有其中一个类型的值。你总是知道 std::variant 可能包含哪些类型。 核心思想: “这个变量要么是一个 int,要么是一个 double,要么是一个 std::string,但它在任何时候都只可能是其中一个。” 特点: 编译时已知类型集: 在声明 std::variant 时,你需要明确列出它可能包含的所有类型。 类型安全: 你不能意外地从 std::variant 中提取一个它当前不持有的类型的值。如果尝试这样做,会抛出 std::bad_variant_access 异常或返回 nullptr。 空间效率: 通常会在栈上分配足够的空间来存储其所有可能类型中最大的那个,避免了动态内存分配(除非内部类型本身需要动态分配)。 无额外开销: 相比于多态(虚函数),std::variant...
缓存一致性与伪共享
结束了两个月的魔都牛马生活,下周又要续上了。也是好久没有更新blog了,面试时被面试官Eric当场打开,才意识到这个的重要性。 什么是False Sharing(虚假共享)? 定义:在多核处理器中,多个核心的缓存行(Cache Line,通常64字节)存储共享数据。当不同核心的线程修改同一缓存行内的不同变量时,缓存一致性协议(如MESI)会认为整个缓存行被修改,导致其他核心的缓存行失效,引发不必要的通信和性能损失。 场景: 核心A的线程更新缓存行中的变量X。 核心B的线程更新同一缓存行中的变量Y(ទ 尽管X和Y无关,MESI协议使整个缓存行在B的缓存失效,B需重新加载数据。 影响:频繁的缓存失效和同步(总线嗅探或目录协议)增加延迟,降低性能(如IPC下降)。 例子: 12struct { int x; int y; } data; // x和y在同一缓存行// 线程1(核心A)更新data.x,线程2(核心B)更新data.y 修改data.x导致缓存行失效,核心B的data.y需重新加载,尽管y未变。 2....
atomic
atomic 是什么及相关操作介绍1. atomic 是什么在 C++ 中,std::atomic 是 C++11 引入的模板类,位于 <atomic> 头文件中,用于实现线程安全的原子操作。原子操作是指在多线程环境中不可分割的操作,保证操作要么完全完成,要么完全不执行,避免数据竞争(data race)。 作用: 提供线程安全的变量读写,防止多线程并发访问导致的数据不一致。 避免使用锁(如互斥锁),减少锁竞争和上下文切换开销。 支持基本数据类型(如 int、bool、指针)和其他自定义类型的原子操作。 典型场景: 多线程计数器。 无锁数据结构(如无锁队列)。 标志位或状态变量的线程安全更新。 2. std::atomic 的核心特性 原子性:操作不可中断,确保线程安全。 内存序:通过 std::memory_order 控制内存访问顺序,优化性能和一致性。 支持类型: 内置类型:std::atomic<int>、std::atomic<bool>...
无锁循环队列
无锁循环队列无锁循环队列(Lock-Free Circular Queue)是一种线程安全的环形缓冲区数据结构,允许多个线程并发访问而无需使用锁(如互斥锁)。它通过原子操作(如 CAS,Compare-And-Swap)确保线程安全,适用于高并发场景,如生产者-消费者模型。 1. 无锁循环队列的特点 循环队列: 使用固定大小的数组,首尾相连形成环形结构。 通过模运算(% size)实现循环索引。 无锁: 使用原子操作(如 std::atomic)避免锁竞争,减少上下文切换和锁开销。 适合多线程环境,降低阻塞,提高吞吐量。 线程安全: 允许多个生产者(push)和消费者(pop)并发操作。 需处理并发时的竞争和一致性问题。 限制: 通常固定大小(非动态扩展)。 实现复杂,需谨慎处理边界条件和 ABA 问题。 2. 实现原理无锁循环队列通常基于以下关键点: 原子变量:使用 std::atomic 管理头(head)和尾(tail)索引,确保线程安全的更新。 CAS...




