
c++
文章平均质量分 91
落樱弥城
无无
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++反射
本文介绍了C++中的反射机制及其实现方式。反射是程序在运行时获取并操作自身信息的能力,C++标准虽未原生支持,但可通过技术手段模拟实现。文章首先通过Python示例展示了反射的基本用法(获取属性/方法、动态创建对象),然后阐述了反射的应用场景(动态类型处理、解耦、序列化等)。接着将反射分为动态反射(运行时)和静态反射(编译时),并对比了两者的特性差异。最后详细介绍了动态反射的实现思路,包括用于存储类型信息的FieldInfo、MethodInfo、TypeInfo类设计,以及全局类型注册器TypeRegis原创 2025-07-30 22:37:42 · 753 阅读 · 0 评论 -
C++20 协程
摘要:本文系统解析C++20协程的核心机制与实现原理,重点探讨协程与普通函数的本质差异、执行流程控制及底层实现细节。通过对比普通函数的栈式调用与协程的状态保持特性,揭示协程在异步编程中的独特优势。文章构建简单协程示例,详细追踪其生命周期(从initial_suspend到final_suspend),并通过改造可手动控制的协程版本(引入coroutine_handle与suspend_always)展示暂停/恢复机制。关键实现技术包括promise_type状态管理、awaitable对象转换逻辑、协程帧内原创 2025-07-26 22:56:49 · 1131 阅读 · 0 评论 -
C++的lambda表达式原理
本文介绍了C++11引入的Lambda表达式特性及其实现原理。Lambda表达式是一种匿名函数,通过捕获列表、参数列表、返回类型和函数体构成,常用于函数式编程和算法应用。编译器会将Lambda转换为匿名类对象,重载operator()实现函数调用功能,并通过捕获列表管理外部变量访问。文章详细分析了值捕获和引用捕获的底层实现,并指出使用时需注意变量生命周期和性能开销问题。Lambda表达式极大地增强了C++的表达能力,是现代C++编程的重要特性之一。原创 2025-07-22 21:14:35 · 323 阅读 · 0 评论 -
Entity Component System架构
ECS架构是一种高效的游戏开发模式,通过实体(Entity)、组件(Component)和系统(System)三者的解耦设计,实现了数据与行为的分离。相比传统OOP架构,ECS具有低耦合、高扩展性、高性能和更好的并行性等优势,尤其适合处理大量动态实体的场景。然而,ECS也存在学习成本高、调试复杂、缓存利用率可能较低等缺点。通过一个2D物体移动的Demo展示了ECS的具体实现,包括实体标识、组件数据结构和系统逻辑处理。ECS架构在复杂游戏开发中展现出独特价值,但也需要根据项目规模权衡其适用性。原创 2025-07-19 15:59:51 · 771 阅读 · 0 评论 -
Variant实现原理(基于MSVC实现分析)
std::variant是C++17引入的类型安全联合体,通过模板参数指定可存储的类型。它使用联合体递归存储不同类型值,并提供类型安全检查。实现上采用union递归存储,并通过编译时索引访问元素(如MSVC最多支持64个类型)。访问时使用std::get<>或std::visit,类型不匹配会抛出std::bad_variant_access异常。variant支持转换构造和赋值,当类型唯一时自动选择合适构造函数。该特性为C++提供了更安全的类型多态机制。原创 2025-07-12 11:50:23 · 283 阅读 · 0 评论 -
自旋锁(C++实现)
自旋锁是一种典型的无锁算法,在任何时刻,它都最多只能有一个保持者。当有一个线程试图获得一个已经被占用的锁时,该线程就会一直进行循环等待,直到该锁被释放。自旋锁的优点是不会使线程状态发生切换,一直处于用户态,即线程一直都是active的;缺点是如果一直获取不到锁,那线程就一直处于循环等待中,白白浪费CPU资源。自旋锁在某些场景下非常有效,尤其是临界区较小且持有时间短的情况下。然而,在高竞争或临界区较长的情况下,使用自旋锁可能导致性能下降,因此需谨慎选择。原创 2025-04-05 18:08:13 · 971 阅读 · 0 评论 -
C++脚本化方案调研
能够看到不同语言的脚本化方案都有自己的优缺点,需要根据具体的场景来选择合适的方案。总的来说,脚本化方案可以提高开发效率,减少开发成本,提高代码的可维护性和可扩展性。但是,脚本化方案也存在一些问题,比如性能损失,安全风险,开发难度等。因此,在选择脚本化方案时,需要综合考虑这些问题,选择合适的方案。原创 2025-03-22 23:52:18 · 1407 阅读 · 0 评论 -
MagicEnum实现原理
magic_enum是一个非常好用的枚举库,它可以将枚举值转换为字符串,也可以将字符串转换为枚举值。// 3。原创 2025-03-17 00:17:00 · 810 阅读 · 0 评论 -
单入单出队列性能优化(Lock-Free)
文中首先介绍了有锁线程安全循环队列的基本实现,然后探讨了使用原子变量实现 Lock-Free 队列的优势,能够减少线程之间的数据竞争。接着,介绍了数据对齐的策略,以降低伪共享的概率,随后引入了索引缓存来减少索引访问冲突的影响。最后,文中提出了使用位运算替代模运算来优化循环队列的性能。原创 2025-02-23 17:48:48 · 828 阅读 · 0 评论 -
Lock-Free环形队列C++实现
本文描述了使用原子变量实现线程安全队列的基本原理和实现。首先分析了多线程情况下队列的访问冲突情况。然后详细描述了Lock-Free单入单出队列的原理和实现,性能测试发现其性能优势相比于带锁的队列比较明显。最后详细描述了Lock-Free堕入多出队列的原理和实现,并给出了准确的性能测试数据。原创 2025-02-23 16:06:38 · 784 阅读 · 0 评论 -
《Performance Analysisi and Tuning on Modern CPU》阅读笔记
本文是《Performance Analysisi and Tuning on Modern CPU》的阅读笔记。该书首先详细描述了现代CPU的硬件架构,一些性能指标和性能优化分析工具。然后介绍了一些从代码上如何修改能够使得代码更加快速的技术细节。最后描述了其他一些技术,并且展望了为了性能优化可能的方向。本文不会赘述硬件架构相关的内容,重点关注第二部分代码优化部分。原创 2025-02-13 23:46:57 · 1038 阅读 · 0 评论 -
理解PLT表和GOT表
PLT 和 GOT 是现代动态链接的核心机制,通过延迟绑定和地址无关性,提升了动态库的加载效率和灵活性。这些机制确保了代码复用及共享的优势,同时优化了性能。原创 2025-01-30 19:15:23 · 1205 阅读 · 0 评论 -
《Memory Barriers a Hardware View for Software Hackers》阅读笔记
每个 CPU 都有其特有的内存屏障指令,这使得跨平台的代码移植性面临挑战。许多软件环境(包括 pthreads 和 Java)限制程序员直接使用内存屏障,转而使用包含必要内存屏障的互斥原语。表 5 列出了不同 CPU 允许的加载和存储重排序的组合。具体而言,前四列表示 CPU 允许的四种加载和存储重排序的组合,接下来的两列表示 CPU 是否允许与原子指令的重排序。以下是一些关键点:在六个 CPU 中,有五种不同的加载-存储重排序组合和四种原子指令重排序的三种可能。原创 2025-01-24 19:33:55 · 1238 阅读 · 0 评论 -
简要描述C++ Memory Order
memory_order_relaxed: 最宽松的内存顺序, 只保证操作的原子性和修改顺序 (modification order).原创 2024-07-06 23:11:46 · 951 阅读 · 0 评论 -
C++异常处理实现(libstdc++)
为了更好的理解C++中异常处理的实现,本文简单描述了Itanium ABI中异常处理的流程和llvm/libsdc++简要实现。原创 2024-05-05 17:10:01 · 1838 阅读 · 0 评论 -
正确对你的C++代码进行性能测试——DoNotOptimize实现原理
是google-benchmark提供的一个函数,强制编译器不要对制定的变量进行任何优化。需要注意的是DoNotOptimize强制编译器不要对制定的不指定的编译器月变量优化而不是不对表达式进行优化,也就是说你的表达式可以被优化的化依然会被优化只是结果一定写内存。return a;int a = 1;return 0;不加DoNotOptimize的化testFunc、a和t都会被删除,而编译后的结果如下。可以看到两个变量都是读取的栈内存。1147: 00。原创 2024-05-02 12:53:33 · 1337 阅读 · 0 评论 -
C++中volatile的具体含义和可能的坑
提醒编译器不要对该变量相关的代码进行优化,避免出现意外的负面作用;对类似的表达式不进行编译层面的指令重排。编译指令重排也是一种编译器优化手段,这条严格来说也是第一条的变种。int g = 0;a < n;a++) {i++;//func对应的汇编a < n;a++) {j++;//func1 对应的汇编a < n;a++) {g++;//func2对应的汇编上面的代码中可以看到对于普通变量的++直接被编译器在编译期间就分析出来结果,直接赋值了,for循环直接被干掉了。原创 2024-01-22 00:52:43 · 2963 阅读 · 0 评论 -
C++ libcxxabi中dynamic_cast 实现
C++中,用于有虚函数的继承链中父类型到子类型的安全转换。class A{public:class B{如何识别当前类的类型,这依赖于RTTI。C++中包含虚函数的对象都有一个虚函数表,一般情况下都在首地址(多继承和虚继承会有多个)有一个指向该虚函数表的虚函数表指针。基类偏移;typeinfo;如果有虚函数的话会有虚析构函数指针,一般情况下有两个;虚函数指针,如果是虚继承对应的虚函数指针可能是一个thunk function。原创 2023-11-26 22:35:56 · 1392 阅读 · 0 评论 -
【crash】 cxa_pure_virtual 崩溃分析与原理
怀疑到这一点,我这边开始找资料(类似的问题印象中标准中是不管的,那大概率在ABI中定义的,那我们去看ABI的定义)。怀疑到这一点,我这边开始找资料(类似的问题印象中标准中是不管的,那大概率在ABI中定义的,那我们去看ABI的定义)。当类被析构时,基类的析构稍微比较耗时时,第二个线程尝试访问当前类的一个被重写的纯虚函数,由于此时的虚函数表中的纯虚函数已经被修改为。当类被析构时,基类的析构稍微比较耗时时,第二个线程尝试访问当前类的一个被重写的纯虚函数,由于此时的虚函数表中的纯虚函数已经被修改为。原创 2023-11-23 00:37:40 · 1616 阅读 · 0 评论 -
Folly库实现阅读——FBString
FBString是facebook内部使用的基础库的string组件,为了达到更好的性能采用了多种存储策略,优化不同场景的性能。FBString完全兼容,同时支持jemalloc更快的分配内存,减少磁盘碎片,加快并发情况下的速度和性能。实现细节三种存储策略;与100%兼容。COW 存储时对于引用计数线程安全。对 Jemalloc 友好。如果检测到使用jemalloc,那么将使用jemalloc的一些非标准扩展接口来提高性能。原创 2023-09-24 22:41:10 · 614 阅读 · 0 评论 -
C++对象模型实验(clang虚函数表结构)
本科期间有对比过msvc,gcc,clang的内存布局,距今已经6-7年了,当时还是使用的c++11。时间过得比较久了,这部分内容特别是内存对齐似乎C++17发生了一些变化,因此再实践下C++类模型。本文描述了C++不同类型的实际内存模型实现,主要关注虚函数表的具体内存布局。虽然clang,msvc都提供了对应的命令让我们直接查看类对象的内存布局,但是我们自己解析一下理解更深一点儿。原创 2023-08-20 22:33:20 · 620 阅读 · 1 评论 -
【crash】浮点除0堆损坏
然后就去看代码排查调用链中可能导致堆损坏的地方(因为开发机无法复现,因此只能通过分析+日志来排查),在排查代码过程中发现了几处可能越界的操作以及除0。IEEE754规定了浮点除0运算的结果为+INF或者-INF,但是C++标准明确规定了该行为未定义的,使用可能会导致UB。实际测试过程中发现只有低版本的机器浮点除0是不支持的,而新机器无论是windows还是Mac浮点除0编译器只会报warning但是结果是INF不会出错。,比较反常,因此排查了该值的计算来源发现是有double除0。比较小只有20个元素)。原创 2023-07-14 23:32:34 · 342 阅读 · 0 评论 -
动态库的入口——VCRT(DLL)和CRT(SO)
为了更加深入的理解动态库的加载初始化过程,本文根据VCRT和Linux-CRT的代码实现详细描述了windows和linux平台下对应动态库加载时会进行哪些工作。本文重点关注全局变量的初始化时机,以及是否有其他额外的操作。原创 2023-06-23 00:25:11 · 1355 阅读 · 0 评论 -
C++ 反汇编简要
C/C++都需要经过编译器变成对应的机器码,通常编译器对程序员是个黑盒子。有些时候我们可能会纠结编译器会不会进行RVO,EBO等优化,以及一些在我们看起来应该正常的代码因为一些UB的行为被C++编译器优化成了不可预期的代码。这时候如果我们了解具体代码是如何编译成对应的二进制机器码对我们查具体的问题非常有益。另一种场景,在开发软件时,线上环境能够复现的问题,我们本地可能是无法复现的。这就需要我们根据线上的堆栈分析具体的原因。原创 2023-06-19 22:17:28 · 3276 阅读 · 0 评论 -
C++源码剖析——unordered_map和unordered_set
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-04-08 21:19:17 · 824 阅读 · 1 评论 -
C++源码剖析——set,multiset,map和multimap
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-04-08 18:06:21 · 676 阅读 · 0 评论 -
C++源码剖析——序列容器适配器(stack,queue,priority_queue)
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-04-02 22:34:23 · 253 阅读 · 0 评论 -
C++源码剖析——list
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-04-02 19:56:27 · 447 阅读 · 0 评论 -
C++源码剖析——forward_list
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-04-02 16:19:02 · 490 阅读 · 0 评论 -
C++源码剖析——deque
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-04-02 14:53:31 · 1039 阅读 · 0 评论 -
C++源码剖析——vector和array
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-03-26 12:48:41 · 577 阅读 · 0 评论 -
C++源码剖析——string和string_view
之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。原创 2023-03-21 00:10:36 · 1199 阅读 · 0 评论 -
C++源码剖析——allocator和allocator_traits
allocator是STL中对一个堆内存分配器,是对内存申请工作的一个封装,将内存的申请和成员的构造抽象开来方便控制。基本上,C++标准库中的容器的默认分配器都是allocator。在C++中分配器是通过模板参数的方式指定给对应的容器,默认就是allocator,用户自己也可以实现自己的内存管理类,对堆的内存进行有效的管理也可以将对应的分配器指定给容器使用(前提是接口保持一致)。原创 2023-03-19 16:27:16 · 1662 阅读 · 0 评论 -
C++多线程以及线程池
1 线程1.1 简介 线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。 同一进程中的多条线程将共享该进程中的全部系统资源原创 2020-06-10 16:11:46 · 5705 阅读 · 3 评论 -
《Effective STL》阅读笔记
一 容器1 慎重选择容器 STL提供了多种容器,不同容器的应用场景不同,需要充分理解容器的使用场景,并针对性的选择合适的容器。C++中的容器类型包括:标准STL序列容器:vector、string、deque、list;标准STL关联容器:set、multiset、map、multimap;非标准序列容器:slist、rope;非标准关联容器:unordered_set、unordered_multiset、unordered_map、unordered_multimap;标准的非STL容原创 2021-11-19 23:01:24 · 1439 阅读 · 0 评论 -
《More Effective C++》阅读笔记
一 基础议题1 仔细区分pointer和reference 指针和引用的区别:引用是一个标记符别名,而指针是一个变量;引用必须赋予初值且不能修改,指针可以存在空指针可修改;引用没有地址,指针在内存中存在。 指针和引用除了上面的区别外,基本上的行为是一致的,因此在具体使用场景上该使用哪一个主要是看是否会修改指针或者引用指向或者表示的对象,如果会修改则使用指针,不会修改则使用引用。2 最好使用C++类型转换 C中的隐式类型转换或者显式类型转换都应该被弃用,使用用途更加明确的C++类型转原创 2021-10-07 00:32:20 · 358 阅读 · 0 评论 -
《Effective C++:55个提升性能的办法》阅读笔记
一 然自己习惯C++1 视C++为一个语言联邦 C++语言本身的出身和目标和其名称表达的意思相近,作为C语言的超集。C++的最初的目标是在保证对C的完全兼容的前提下扩充面向对象的能力,提升研发效率。典型的就是早期的C with Class版本,但是当C++继续发展出现重载、虚函数、模板之后这一目标已经无法完全保证了。因此无法简单的将C++看作C的超集,只能将其看作部分兼容C的面向对象语言。 为了更加清晰的认识C++可以将C++看作一个由多个次语言组成的语言的集合而不是某个单一语言,而每个次语言的规原创 2021-10-05 23:52:04 · 579 阅读 · 0 评论 -
程序员自我修养阅读笔记——静态链接
测试环境:➜ tmp uname --versionuname (GNU coreutils) 8.25Copyright (C) 2016 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.This is free software: you are free to change and redistribute .原创 2021-09-21 22:59:09 · 511 阅读 · 0 评论 -
程序员自我修养阅读笔记——目标文件里有什么
1 目标文件格式 PC平台的目标文件格式大都是COFF的变种,比如Windows的PE(Portable Executable)格式和Linux的ELF(Executable Linkable Format)格式。并且我们一般讲的目标文件格式多指可执行文件,但是实际上编译过程中的静态库文件、动态库文件和.o或者.obj文件都属于目标文件。常见的目标文件分类:目标文件类型说明举例可执行文件可以直接执行的程序windows的exe文件、linux的可执行文件、macOs的app文原创 2021-09-21 15:24:59 · 1821 阅读 · 2 评论 -
深入探索C++对象模型之站在对象模型的顶端
1 模板具象化:这里的具象化是指编译器需要针对指定的类型参数实例化一个版本的类对象或者函数版本。1.1 模板具象化时机 对于一个模板类的指针或者引用,何时实例化一个具象化版本的模板类,根本依据是当前声明的对象是否需要一个类的完整信息,如果不需要则不进行实例化,如果需要则进行。 模板类的成员函数应不应该被具象化,也就是说当需要具象化一个版本的类时,需不需要把其对应的具象化版本的成员函数也具象化出来。C++标准要求只有当成员函数被使用时才进行相关的具象化。但是并不是所有的编译器都会遵从这个要求,原创 2020-12-22 16:52:12 · 248 阅读 · 0 评论