- 博客(229)
- 资源 (19)
- 收藏
- 关注
原创 【C++基础知识】odygrd/quill 中编译时计算可变参数个数的原理解析
基本思路: - 利用预处理器参数匹配规则:当宏调用时,参数从左到右依次匹配 - 通过参数位置的偏移来获取参数数量
2025-04-03 15:33:58
352
原创 【性能优化点滴】odygrd/quill在编译期做了哪些优化
Quill 是一个高性能的 C++ 日志库,它在编译器层面进行了大量优化以确保极低的运行时开销。Quill 通过这些优化实现了纳秒级的日志记录性能,在基准测试中通常比 spdlog 等库快 2-5 倍,尤其适合高频日志场景(如金融交易系统)。
2025-04-03 11:26:40
562
原创 【C++基础知识】 C 预处理器中的 #line 指令详解
是 C/C++ 预处理器的指令之一,主要用于。这样,如果生成的代码有语法错误,编译器会报告。如果宏展开后报错,默认情况下错误指向的是。文件,但编译错误时,我们希望错误指向。文件),而不是生成的中间代码。:普通代码通常不需要手动使用。(因为行号会自动递增)。,但有时我们需要知道。
2025-04-02 18:01:55
734
原创 【C++基础知识】PIMPL模式详解(Pointer to IMPLementation)
/ 必须在外联定义(因为unique_ptr需要完整类型删除)
2025-04-02 16:59:53
300
原创 【C++常见问题】【C++基础知识】全局变量菱形链接问题详解
全局变量菱形链接问题是C++多模块编程中的典型问题,源于头文件被多次包含导致的变量多重定义。通过正确使用extern声明、static限定或C++17的inline变量,可以有效避免这一问题。理解这一问题的本质有助于编写更健壮的C++代码,特别是在大型项目中管理全局状态时。
2025-04-02 15:40:27
391
原创 【C++基础知识】Name Mangling(名字修饰)机制的作用与解决的问题
Name Mangling 是 C++ 实现高级特性(如重载、模板、命名空间)的基石,但也导致二进制兼容性问题(不同编译器修饰规则不同)。Name Mangling 将函数名、参数类型、命名空间等信息编码成唯一的修饰名(Mangled Name),确保链接器能正确匹配调用。C++ 的命名空间和类作用域允许不同上下文中定义同名符号,但链接器需要全局唯一的符号名。C++ 允许函数重载(多个同名函数,参数不同),但底层链接器(如 Linux 的。模板函数/类在实例化时会生成不同的具体实现,链接器需要区分它们。
2025-04-02 10:30:04
371
原创 C++基础知识--模版
学习 C++ 模板需要系统性地掌握从基础到高级的多个知识点。建议按照「基础 → 进阶 → 元编程 → 实战」的顺序逐步学习,每个阶段配合实践项目巩固理解。
2025-03-28 17:41:50
1020
原创 C++基础知识--std::deque
(Double-Ended Queue,双端队列),它是 C++ STL(标准模板库)中的一个容器。下面详细介绍它的特性、用法及实现原理。高效插入和删除元素(O(1) 时间复杂度)。(双端队列)是一种动态数组,支持在。通常由多个固定大小的。如果需要高性能双端操作,
2025-03-27 15:52:07
398
原创 【性能优化点滴】odygrd/quill 中RotatingSink使用std::deque<FileInfo>存储文件列表且FileInfo不包含完整路径的原因
std::deque:因高效头尾操作和缓存友好性。无完整路径:避免冗余存储,路径动态拼接更灵活,符合日志滚动场景的典型需求。
2025-03-27 10:52:31
247
原创 【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
它是高性能日志库中常见的优化手段之一,尤其适用于需要平衡实时性和吞吐量的场景。
2025-03-24 21:06:25
463
原创 【性能优化点滴】odygrd/quill 中的冷热属性宏
这段代码通过编译器特定的属性指令,指导代码生成策略,是高性能 C++ 库中常用的优化手段。理解这些属性有助于开发低延迟、高吞吐的系统级软件。在日志库等性能敏感场景中,通过精细控制代码布局和分支预测,可提升 5-15% 的吞吐量(实测数据)。通过条件编译确保在不支持这些属性的编译器上宏定义为空,保证跨平台兼容性。集中定义属性宏,避免代码中散落编译器特定的属性语法。日志库中被用于性能关键路径的优化。这些宏在 quill。
2025-03-24 19:48:35
351
原创 【性能优化点滴】枚举值转字符串的两种方式对比(switch VS std::array)
(需优化实现),其效率通常更高且更易维护。开始,可将数组改为 constexpr。
2025-03-24 15:06:09
355
原创 【CMake】include_directories命令的 system 属性
SYSTEM属性:用于标记第三方或系统头文件路径,抑制编译器警告。适用场景:管理外部依赖的头文件,保持项目编译输出的整洁。慎用原则:仅对第三方代码使用,避免掩盖项目自身的代码问题。
2025-03-21 13:37:03
804
原创 【cmake】控制依赖传递
PRIVATE:隔离内部细节,避免依赖泄露。PUBLIC:传递接口依赖,确保依赖链完整。INTERFACE:定义纯接口或配置需求。正确使用这三个修饰符,可以确保构建系统的高效、清晰和可维护性。
2025-03-21 11:32:57
807
原创 C++基础知识-- 虚拟继承
虚拟继承是 C++ 多重继承中解决菱形问题的关键机制,但会引入额外开销和复杂性。在实际开发中,应谨慎使用,优先考虑更简单的设计模式(如组合或单一继承)。理解其底层原理有助于优化关键代码和调试复杂继承问题。它通过确保共享基类(虚基类)在继承体系中仅存在一个实例,避免数据冗余和成员访问的二义性。是一种特殊的继承方式,旨在解决多重继承中的。关键字声明虚拟继承,使共享基类(的访问均指向该共享实例。
2025-03-19 22:26:36
555
原创 c++基础知识--返回值优化
NRVO 是编译器的优化行为,并非强制要求。不同编译器(如 GCC、Clang、MSVC)的优化策略可能不同。编译器将调用方的目标内存地址隐式传递给函数,函数内部直接在该地址上构造对象,避免拷贝。是一种编译器优化技术,用于消除函数返回一个局部对象时的拷贝或移动操作。NRVO 是 C++ 高性能编程的重要优化手段,合理利用可显著提升代码效率。的一种更复杂的变体,适用于返回具名对象(即给局部变量命名的对象)的场景。若函数中存在多个分支返回不同的具名对象,编译器可能无法应用 NRVO。
2025-03-19 21:51:16
266
原创 权限 0755和 0777 的含义
在 Linux 和类 Unix 系统中,文件或目录的权限由三位或四位的八进制数字表示(如。理解权限机制是 Linux 系统管理的基础,合理分配权限能有效保障系统安全和数据隐私。权限值的计算方式是将这些值相加。
2025-03-19 11:48:34
313
原创 C++基础知识 -- vector、unordered_map 和 map扩容机制
底层是哈希表,通过哈希函数将键映射到桶(bucket)。哈希冲突(不同键映射到同一桶)需特殊处理。本质是一个动态数组,其内存空间连续,支持随机访问(O(1)时间复杂度)。理解这些机制有助于在开发中合理选择容器,优化性能并规避潜在问题(如 vector 的迭代器失效)。需要频繁插入/删除键值对,红黑树在保证 O(log n) 操作的同时,减少了平衡调整的开销。是三个核心容器,它们的底层实现机制直接影响性能和适用场景。,每个桶存储一个链表(或红黑树)。在 C++ STL 中,)时,会自动触发扩容。
2025-03-12 19:55:43
817
原创 《程序员的自我修养—链接、装载与库》-- 对书中常见段的讲解总结
书中通过分析目标文件的结构(如 ELF 格式),解释了这些段如何被链接器组织、操作系统加载,最终形成进程的内存映像。理解这些段的划分,对优化程序体积、分析内存泄漏、调试底层问题至关重要。
2025-03-11 17:24:52
321
原创 八皇后问题的几种常见解法及对应的 C++ 实现代码
根据问题规模选择合适的实现:小规模用经典回溯(易读),大规模用位运算优化(高效)。:每行皇后必在不同列,转化为寻找列索引的排列,并检查对角线。:用位掩码记录列和对角线的占用状态,减少判断时间。:逐行放置皇后,检查每个位置是否与已有皇后冲突。
2025-03-06 17:22:51
126
原创 回溯算法通俗讲解
想象你在玩一个多结局的文字冒险游戏,每次选择都会影响后续剧情。为了找到完美结局,你每做一个选择就「存档」,如果发现这条路走不通,就「读档」回到上一个选择点,尝试其他选项——这就是回溯算法的思想。试着用这个框架去解决LeetCode上的回溯标签题目吧(如子集、括号生成、单词搜索等),实践中会加深理解。常见应用场景:排列/组合、子集、分割字符串、棋盘问题(N皇后、数独)、图路径搜索等。(回溯)来遍历所有可能解的算法,适用于需要穷举但存在约束条件的问题。,找出所有和为8的组合(可重复使用数字)。
2025-03-06 16:55:45
249
原创 c++基础知识(六)
在C++中,拷贝构造函数和移动构造函数是用于对象初始化的两种关键机制,它们分别针对不同的资源管理场景。通过合理使用拷贝与移动构造函数,可在保证正确性的同时优化资源管理效率,是C++现代编程的核心技术之一。
2025-02-18 21:02:18
759
原创 从 0 开始使用 cursor 开发一个移动端跨平台应用程序
通过 Cursor 和 React Native,你可以快速开发一个跨平台移动应用。Cursor 提供了现代化的开发环境和强大的工具支持,而 React Native 则提供了高性能和跨平台能力。结合这两者,你可以高效地开发和测试你的应用,并最终打包发布到各大应用商店。
2025-02-12 20:15:02
1417
原创 汉语和英语的语言特点
理解这些特点有助于跨越语言屏障,实现更精准的跨文化交流。两种语言的差异本质反映了东西方思维方式的深层分野:汉语体现。(天人合一),英语则反映。
2025-02-07 17:55:13
848
原创 程序员的自我修养(链接、装载与库)--摘录与汇总(二)
因为编译器编译期间无法确认是模块内的还是模块外的很明显,外部模块的全局变量是和装载地址有关的,也就是“变化”的,按照 PIC 的基本思想,需要把这部分变化的挪到数据段中,而数据段中存放这类数据的叫做。
2024-10-14 19:46:38
943
原创 程序员的自我修养(链接、装载与库)--摘录与汇总(一)
1、“未初始化的全局变量”在目标文件中并未放到 .bss 段中,而是标记为一个 COMMON 类型的变量,这是因为“未初始化的全局变量”是一个弱符号,其最终占用的大小未知,所以编译器此时无法为该弱符号在 BSS 段分配空间。在链接之前,目标文件中的所有段的 VMA(虚拟地址 Virtual Memory Address) 都是 0,因为虚拟空间还没有被分配,所以他们默认都为 0,等到链接之后,可执行文件中的各个段都被分配到了相应的虚拟地址。而每个副本进程的数据区域是不一样的,他们是进程私有的。
2024-09-29 21:11:21
920
原创 sqlite3 相关知识
WAL 模式 VS 日志模式特性WAL 模式日志模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始事务时写入日志文件,完成后再更新主数据库。读操作读
2024-09-05 15:09:33
744
原创 程序员的自我修养--术语随笔
总之,PLT 是为了实现共享库的动态链接而设计的一个重要的数据结构。它能够在程序运行时动态地解析共享库函数的地址,从而使得程序在不同的环境中能够正确链接到共享库中的函数。这对于实现共享库的延迟绑定和动态链接非常重要。当程序调用共享库中的函数时,实际上是首先跳转到了 PLT 的相关条目。这个 PLT 条目会调用动态链接库中的函数。(或者类似的函数),这个函数会进行符号解析和重定位。
2024-09-02 21:19:05
322
原创 C++基础知识(四)
链接时重定位和装载时重定位特性链接时重定位装载时重定位发生时机发生在编译器进行静态链接或动态链接时发生在程序加载到内存并准备执行时作用将各个目标文件、库文件中的位置无关的代码链接成一个单独的可执行文件或库文件,并对符号进行最终的地址绑定。将可执行文件或共享库中的引用符号和实际地址进行绑定,确保程序能够正确地访问共享库中的函数和数据。阶段链接阶段装载阶段静态链接 VS 动态链接特性静态链接动态链接生成的文件大小独立性独立
2024-09-02 10:21:23
329
JAVA核心技术:卷Ⅰ基础知识
2013-01-21
NIIT课堂笔记
2012-12-11
创建一个多边形Active控件
2012-12-10
动态链接库运算器
2012-12-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人