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...
类和结构体
类和结构体的区别类和结构体是面向对象编程中两种重要的数据结构,它们有以下主要区别: 1. 默认访问控制 类:成员默认为私有(private) 结构体:成员默认为公开(public) 2. 内存分配位置 类:通常在堆(heap)上分配内存 结构体:通常在栈(stack)上分配内存 3. 继承特性 类:可以实现继承、多态等完整的面向对象特性 结构体:在许多语言中不支持继承或有限支持继承 4. 语言差异不同编程语言对类和结构体的区别处理不同: C++1234567891011struct Point { int x; // 默认public int y;};class Point { int x; // 默认private int y;public: void setPoint(int a, int b) { x = a; y = b; }}; C#12345678910111213// 值类型,存储在栈上struct Point { public int X; ...
OSI模型
我们一般说网络有七层,是指OSI模型,从下到上依次为: 物理层 (Physical Layer) 数据链路层 (Data Link Layer) 网络层 (Network Layer) 传输层 (Transport Layer) 会话层 (Session Layer) 表示层 (Presentation Layer) 应用层 (Application...
构造函数
C++中的构造函数在C++中,构造函数是类中用于初始化对象的特殊成员函数。它们与类同名,没有返回类型(连void也没有)。以下是C++中常见的构造函数类型: 1. 默认构造函数 定义:不带参数或所有参数有默认值的构造函数。 作用:创建对象时无需提供初始值。 示例:1234567class MyClass {public: MyClass() { x = 0; } // 默认构造函数private: int x;};MyClass obj; // 调用默认构造函数 2. 参数化构造函数 定义:带参数的构造函数,用于初始化对象的成员。 作用:允许通过参数传递初始值。 示例:1234567class MyClass {public: MyClass(int val) : x(val) {} // 参数化构造函数private: int x;};MyClass obj(10); // 调用参数化构造函数 3....
http,tcp与websocket
HTTP协议、TCP协议、WebSocket的区别以下是HTTP协议、TCP协议和WebSocket的区别,从定义、功能、特点等多个方面进行比较: 1. TCP协议 定义:TCP(Transmission Control Protocol,传输控制协议)是传输层协议,属于OSI模型的第四层或TCP/IP模型的传输层。 功能: 提供可靠的、面向连接的数据传输。 确保数据按序到达、无丢失、无重复,通过三次握手建立连接、四次挥手断开连接。 提供流量控制和拥塞控制机制。 特点: 可靠性:通过确认机制(ACK)、重传机制和错误检测确保数据完整性。 面向连接:通信前需建立连接,通信后需断开连接。 适用场景:需要高可靠性的场景,如文件传输(FTP)、电子邮件(SMTP)、HTTP等。 缺点:相比UDP,开销较大,速度较慢。 与HTTP/WebSocket的关系: TCP是HTTP和WebSocket的底层传输协议,HTTP和WebSocket依赖TCP提供可靠的数据传输。 2. HTTP协议 定义:HTTP(HyperText Transfer...
进程的信息与如何设置进程退出
查看进程信息与设置进程优雅退出以下是如何在Linux/Unix系统中查看进程信息以及设置进程优雅退出的方法,使用常用命令和工具,结合C++编程示例。 1. 查看进程信息方法1:使用 ps 命令ps 命令用于显示进程信息,常用选项如下: ps aux:显示所有用户的所有进程。 a:显示所有用户的进程。 u:显示详细用户信息。 x:显示无终端的进程。 ps -ef:显示所有进程,包含完整命令行。 ps -p <PID>:查看指定进程ID(PID)的详细信息。 示例:查看所有进程的PID、用户、CPU/内存使用情况: 1ps aux 输出示例: 123USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 123456 7892 ? Ss Jun28 0:01 /sbin/initalice 1234 1.2 0.5 987654 12345 pts/0 S ...
stl中的无序关联容器底层实现
unordered_map 时间复杂度与底层实现以下是对 C++ 中 unordered_map 时间复杂度、底层实现以及哈希冲突解决方法的详细分析。 1. unordered_map 时间复杂度unordered_map 是 C++ STL 中的无序关联容器,基于哈希表实现。其操作的时间复杂度如下: 平均情况: 插入(insert)、查找(find)、删除(erase):( O(1) )(常数时间)。 这是因为哈希表通过哈希函数将键映射到桶(bucket),平均情况下每个桶的元素很少,操作接近常数时间。 最坏情况: 插入、查找、删除:( O(n) ),其中 ( n ) 是容器中元素数量。 最坏情况发生在哈希冲突严重时,例如所有键都映射到同一个桶,导致桶内元素形成长链表或类似结构。 导致 ( O(n) ) 的情况 哈希函数质量差:如果哈希函数将大量键映射到同一桶,冲突增加,桶内查找退化为线性搜索。 高负载因子:负载因子(load_factor = 元素数 / 桶数)过高,导致更多冲突。C++ 默认最大负载因子为 1.0,当超过时会触发...



