- 博客(573)
- 收藏
- 关注
原创 FastDDS中Utils定义的那些数据结构(二)
这个文件中定义的宏都是和C++编译器提供的默认函数相关的,这样做的目的有助于代码简洁,所有类的构造函数都适用。这个是可以复用的,自己的库也可以设计成这样的。
2025-03-12 23:54:50
830
原创 FastDDS中Utils定义的那些数据结构(一)
比如要存储1000 ~ 1100 之间的数据,传统固定从 0 开始的位图需要 1100 位,而 BitmapRange 只需要 100 位,节省 90% 的存储,因为可以将base_设置为1000,只需要存储1-100之间的数,也就是100位。使用boost库实现的强壮的条件变量,这个类中维护了一个信号量容器,有两个链表,一个是空的链表,一个是正在使用的信号量的链表。每次申请信号量时,从空闲的链表中取信号量,放入正在使用的信号量链表,然后使用,最后将信号量放回空的信号量链表。
2025-03-11 07:27:44
574
原创 深入理解 fnmatch 函数的实现
pattern:这是包含模式匹配的通配符的字符串(例如 *.txt),它指示了要匹配的文件名的模式。string:要进行匹配的文件名或字符串。flags:指定匹配的选项(如是否区分大小写,是否支持正则表达式等)。常见的 flags 包括:FNM_CASEFOLD:忽略大小写。FNM_PATHNAME:仅匹配路径分隔符(通常是 /)的部分。FNM_PERIOD:.只能以明文进行匹配,不可以再使用?或*进行匹配。
2025-02-18 23:50:02
670
原创 理解三种哈希算法:MD5、CRC、SHA256
哈希算法是一类重要的算法,用于将任意长度的数据映射为固定长度的哈希值。哈希算法广泛应用于数据完整性校验、密码学、数字签名等领域。本文将详细介绍三种常见的哈希算法:MD5、CRC 和 SHA256,并探讨它们的原理、特点及应用场景。
2025-02-18 21:52:00
1063
原创 C++中std::condition_variable_any、std::lock_guard 和 std::unique_
在 C++ 多线程编程中,同步 和 互斥 是至关重要的概念。C++ 标准库提供了多种同步机制,其中 std::condition_variable_any、std::lock_guard 和 std::unique_lock 是经常被用到的工具。本文将详细介绍这三者的用途、区别、适用场景,并通过示例展示如何正确使用它们。
2025-02-18 21:51:33
693
原创 C++ 中的 std::timed_mutex 和 std::recursive_timed_mutex
在多线程编程中,互斥锁(Mutex)是用于保护共享资源的重要工具。C++ 标准库提供了多种互斥锁类型,其中 std::timed_mutex 和 std::recursive_timed_mutex 是两种支持超时功能的互斥锁。在阅读FastDDS源码时,发现了这两种类型,以前没有使用过,顺便补盲记录下。
2025-02-10 23:43:08
808
原创 CMake 小知识:CMAKE_INSTALL_PREFIX 与 option 变量的覆盖规则
option 是 CMake 中用于定义布尔变量的命令,通常用于控制编译选项或功能开关。在 CMake 项目中,可能存在多个 CMakeLists.txt 文件(例如,根目录和子目录中各有一个)。如果在不同级别的 CMakeLists.txt 中定义了同名的 option 变量,它们的值会如何覆盖呢?父目录的 option 优先于子目录:如果在父目录的 CMakeLists.txt 中定义了 option,子目录中的同名 option 不会覆盖父目录的值。# 父目录 CMakeLists.txt。
2025-02-09 23:33:14
889
原创 编译加速工具ccache
ccache(Compilation Cache)是一个开源的编译缓存工具,最初为 C/C++ 设计,但也可以用于其他语言的编译过程(如 Objective-C、CUDA 等)。它的核心思想是通过缓存编译结果,避免重复编译相同的代码,从而减少编译时间。ccache 的主要功能是拦截编译器调用(如 gcc 或 clang),检查是否已经缓存了当前的编译任务。如果缓存命中,ccache 会直接返回缓存的结果;如果未命中,ccache 会调用真正的编译器,并将结果缓存以备后续使用。
2025-02-09 23:08:33
1004
原创 学习std::is_base_of笔记
在现代 C++ 中,模板元编程(Template Metaprogramming)是一种非常强大的编程技巧,它让我们能够在编译期进行类型推导和约束。而 std::is_base_of 是一个重要的工具,可以用来检查一个类型是否是另一个类型的基类。std::is_base_of 是 C++11 引入的一个类型特性(Type Trait),位于头文件 <type_traits> 中。它用于检查一个类型 Base 是否是另一个类型 Derived 的基类。
2025-01-26 17:57:51
599
原创 Effective C++ 规则53:不要轻忽编译器的警告
这是错的,编译器是在告诉你声明于 B 中 的 f 并未在 D 中被重新声明,这是因为const是函数签名的一部分,这里的D定义了一个新的函数,而不能实现多态。如果忽略这个警告,几乎肯定导致错误的程序行为,然后为了找出这个编译器已经告诉你的错误而进行许多调试。这里希望 D::f()重新定义 虚函数 B::f(),但其中有个错误,B::f() 是个 const成员函数,而 D 不是。编译器可能会发出警告,提示你定义了未使用的变量。这种警告指出使用了未初始化的变量,可能导致未定义行为,可能和编译器有关系。
2025-01-25 21:51:47
303
原创 Effective C++ 规则51:编写 new 和 delete 时需固守常规
如果为类定义了自定义的 operator new,则必须同时定义对应的 operator delete。public:/*下面这句会执行两步:1、调用 operator new(size_t size) 为对象分配内存,在执行这一步时,会将sizeof(Widget)作为参数2、调用对象的构造函数在分配的内存上初始化对象。*/delete w;C++ 提供了 placement new,允许你在已分配的内存上构造对象。
2025-01-25 21:51:31
650
原创 Effective C++ 规则50:了解 new 和 delete 的合理替换时机
在 C++ 中,new 和 delete 是动态分配内存的核心操作符。然而,直接使用它们有时会增加程序的复杂性,甚至导致内存泄漏和其他问题。因此,了解何时替换 new 和 delete 并选择更适合的内存管理策略,是编写高效、健壮 C++ 程序的关键。
2025-01-25 21:51:10
755
原创 Effective C++ 规则49:了解 new-handler 的行为
new-handler 是 C++ 提供的一种强大的机制,允许开发者在内存分配失败时定制处理逻辑。通过全局或类专属的 new-handler,程序可以优雅地应对内存不足的情况。尽管如此,new-handler 的使用需要谨慎。合理地释放资源、避免递归调用以及处理异常是实现一个可靠 new-handler 的关键。
2025-01-25 21:50:46
508
原创 Effective C++ 规则48: 认识 Template 元编程
模板元编程是指利用 C++ 的模板机制,在编译期执行某些逻辑运算或代码生成的技术。通过模板元编程,可以在编译阶段完成类型推导、条件分支、递归计算等任务。C++ 语言的模板功能不仅仅是为了解决类型参数化的问题,它还可以在编译期完成大量计算和逻辑操作。
2025-01-25 21:50:30
527
原创 Effective C++ 规则47: 请使用 Traits Class 表现类型信息
C++ 是一种静态类型语言,类型的特性在编译期就可以被识别和操作。为了更好地利用编译期信息来编写高效、灵活、可维护的代码,C++ 提供了一些技术来“萃取”或“提取”类型的相关信息。即利用 traits 类来封装和提取类型信息,以便在编译期进行各种类型相关的判断和操作。Traits Class(类型萃取类)是一个用来提取类型信息的模板类。通过 traits class,我们可以在编译期获得类型的各类信息,并根据这些信息在模板代码中进行分支选择或优化。
2025-01-25 21:50:14
651
原创 Effective C++ 规则46: 需要类型转换时,请为模板定义非成员函数
支持隐式类型转换:非成员函数允许对所有参数进行隐式类型转换,而成员函数只能对非 this 参数进行转换。提升灵活性:非成员函数可以更好地处理多种操作数的组合。友元函数的封装性:使用友元可以在保持封装的同时,让非成员函数访问类的私有数据。当操作符重载需要支持隐式类型转换时,选择非成员函数更合适,尤其是在模板类中。
2025-01-24 17:54:32
264
原创 Effective C++ 规则45:运用成员函数模板接受所有兼容类型
使用成员函数模板可以显著提升类的灵活性和通用性,尤其是在处理与模板参数兼容的其他类型时。这种方法既能提高代码复用性,也能避免不必要的性能开销。规则的核心是:在设计类时,不要把类模板的参数限制得太死,通过成员函数模板,可以让类更适应不同的应用场景,同时保持高效和简洁的代码风格。
2025-01-23 20:44:41
290
原创 Effective C++ 规则43:学习处理模板化基类内的名称
如果只需访问少量基类成员,this-> 更简洁。如果需要频繁访问基类成员,using 更高效且可读性更强。
2025-01-23 20:43:57
460
原创 Effective C++ 规则42:了解typename的用法
当在模板中访问嵌套类型(比如类型别名或类型定义),如果该类型是依赖于模板参数的,就必须使用 typename。public:// 必须使用 typenameT::value_type 是依赖于模板参数 T 的。编译器在解析模板时无法确定 T::value_type 是一个类型还是一个变量,因此需要 typename 明确表示它是一个类型。在模板代码中,嵌套类型名依赖于模板参数时,必须使用 typename。如果编译器能确定类型的性质(非模板依赖),则不需要 typename。
2025-01-23 20:43:15
516
原创 Effective C++ 规则41:了解隐式接口和编译期多态
C++ 中的 隐式接口 是指类或者模板中不显式声明为接口的一部分,但仍然可以像接口一样使用的成员或方法。隐式接口通常指那些不显式声明为虚函数的函数或者方法,但在多态上下文中仍然能表现出类似接口的行为。,尤其是 模板类型推导、SFINAE(Substitution Failure Is Not An Error) 技术或者 类型特性(type traits)等编译期机制中。它使得类和函数可以灵活地与多种类型协作,而无需显式继承或声明接口。这里的 Printer 类依赖于类型 T 是否有 print() 方法。
2025-01-22 23:50:48
702
原创 async++库的使用示例
如前面的博客介绍的,这个库中提供了async::spawn方法,这个方法通常用来启动异步函数,这个框架会利用线程池去完成函数,因此要注意数据安全。正因为将任务放到了单独的线程执行,并且还有调度开销,因此简单的任务最好不要使用这种方法,得不偿失。
2025-01-22 23:03:42
1483
原创 VIM 的 YCM 插件
VIM 是一个非常强大的文本编辑器,因其高效的操作方式和丰富的插件生态系统而备受开发者喜爱。对于开发人员来说,代码补全和智能提示是提升编程效率的重要工具,而 YouCompleteMe(YCM) 插件就是其中一款功能强大且广泛使用的补全插件。YouCompleteMe(简称 YCM)是一个为 VIM 编辑器设计的代码补全插件。它能够提供智能代码补全、错误检查、实时提示等功能,支持多种编程语言,如 C/C++、Python、JavaScript、Go 等。
2025-01-21 00:04:35
910
原创 深入了解 alias 命令
在 Unix 和类 Unix 系统中,alias(别名)是一个非常实用的命令,它允许用户为常用的命令设置简短的别名,从而减少重复输入复杂命令的时间,提高工作效率。尤其是在命令行操作中,alias 能大幅度提升生产力。alias 是 Unix/Linux 系统中的一个命令,允许用户为长命令、参数或复杂的命令序列创建别名。使用别名,用户可以通过输入简短的命令来执行预定义的操作,从而减少键盘输入的时间和错误。
2025-01-15 23:48:46
787
原创 async++源码阅读——parallel部分
internal_parallel_for 是一种并行化的循环执行函数,适用于在多个线程中并行执行对容器中每个元素应用相同操作的场景。每个线程处理容器的不同部分,执行相同的操作,典型的使用场景是遍历数组或集合。数据驱动:它的任务是对一个数据集(由 partitioner 提供)执行相同的操作,每个数据项执行相同的函数 func。任务拆分与并行:它会将数据分割成多个部分,并在多个线程中并行处理这些部分。如果无法再拆分,任务会在当前线程中顺序执行。
2025-01-15 19:20:26
641
原创 async++源码阅读——when_all和when_any
when_all:等待一组异步任务都完成。when_any:等待一组异步任务中的任意一个完成。这两个函数提供了更加灵活的异步操作控制,允许开发者在不同的场景下根据任务完成的条件来进行处理。
2025-01-15 19:19:11
359
原创 async++源码阅读——调度模块
在任何框架中,调度模块都是核心,所谓调度模块就是如何组织任务的执行,使其能代码自动完成添加任务,消费任务,唤醒主线程执行任务,正确的返回任务的状态。在阅读调度模块时,发现和sylar框架中的调度模块和httplib中的调度模块核心思想差不多,看来阅读源码还是非常有必要的,可以帮助我们快速的理解代码含义。本文章主要记录一些本人认为有必要复习的任务,不会像task模块添加那么详细的注释。
2025-01-14 12:19:31
794
原创 async++源码阅读——task模块
1、task_base.h本人将自己的理解以注释的形式添加的代码中,方便需要的时候重新复习。该文件中用到的一些技术:该文件中的类并没有使用virtual,而是自定义了需函数表,但是并没有放到每个对象的开始位置,而是通过指针进行存取。EBO技术,空类对象本来就占用一个字节的空间,为了节省空间,EBO就是利用这一个字节的空间存储信息对类成员指定内存对齐方式该框架中将一个任务设计成了func和result的组合,task_result用于保存任务的结果而func_holder保存真正执行的函数,而ta
2025-01-14 00:06:29
801
原创 学习标准库atomic_base.h中typedef enum memory_order
在多核处理器或多线程环境下,操作系统与硬件会对内存访问进行优化,以提高性能。这种优化有时会导致内存访问的顺序与程序代码中的顺序不一致。为了确保程序中的线程能够以某种可预测的顺序访问共享内存,我们需要通过内存顺序来控制原子操作的顺序和同步。内存顺序主要用于控制原子操作(如 atomic_load、atomic_store、atomic_exchange 等)对内存访问的影响在 C++ 标准库中,memory_order 被定义为一个枚举类型,用来指定原子操作的内存顺序。
2025-01-06 21:14:06
953
原创 template<typename Func, typename = void> 在类模板中的应用
template<typename Func, typename = void> 在类模板中的应用,充分体现了 C++ 模板编程的灵活性。通过使用默认模板参数和与 SFINAE 相结合的机制,我们可以实现基于类型特征的模板特化和重载,使得代码更加通用、简洁且具备高度的可扩展性。
2024-12-25 19:41:37
708
原创 系统压力测试助手——stress-ng
stress-ng 是一个强大的工具,它通过生成各种计算密集型、内存密集型、I/O 密集型等工作负载,来模拟不同类型的压力测试。stress-ng 可以对 CPU、内存、磁盘、网络等硬件资源施加负载,从而测试系统在极端负载下的稳定性和性能。stress-ng 的优势在于它能够产生各种类型的负载,并且能够通过多种方式配置负载的强度、持续时间等。它支持对单个组件(如 CPU、内存、磁盘等)进行压力测试,也支持对系统的多种资源进行综合测试。
2024-12-24 23:58:47
2326
原创 使用 perf 工具进行性能分析
perf 是一个功能强大的性能分析工具,可以帮助开发人员从多个维度进行系统和应用程序的性能分析。通过掌握 perf 的基本命令和高级功能,开发者可以更高效地定位性能瓶颈,优化系统的运行效率。
2024-12-24 23:38:46
1243
原创 std::async 和 std::packaged_task
在现代 C++ 中,std::async 和 std::packaged_task 是两个非常重要的工具,能够帮助我们更好地处理并发和异步操作。它们分别代表了异步执行任务的两种不同的方式,但都可以有效地将任务的执行从主线程或调用线程中分离出来,以提高程序的并发性和响应能力。
2024-12-20 00:04:33
673
原创 理解verbalexpressions.hpp 库:不需要理解正则表达式语法就可以写出优雅的正则表达式
verbalexpressions.hpp 是一个优秀的 C++ 库,特别适合那些需要构建和使用正则表达式的开发者。它提供了简洁且易于理解的 API,帮助开发者避免繁琐的正则语法,同时让代码更加可读和易于维护。通过这个库,开发者可以轻松构建出清晰而强大的正则表达式,尤其在处理简单到中等复杂度的文本匹配任务时非常高效。如果你对正则表达式不太熟悉,或者希望使正则表达式代码更加简洁明了,verbalexpressions.hpp 是一个非常值得尝试的工具。
2024-12-19 18:23:18
244
原创 详细介绍top 命令的各项参数及输出信息
top 命令是 Linux 系统中用于监控资源使用情况的重要工具。通过各种参数的灵活组合,可以实时查看 CPU、内存、交换区等资源的使用情况,并对进程进行管理。熟练掌握 top 命令和它的各项输出信息,将有助于程序员高效地管理和维护 Linux 系统的性能。
2024-12-19 18:19:35
1260
原创 C++ 异步编程的利器std::future和std::promise
在现代计算机系统中,许多任务可能需要花费较长时间才能完成,例如网络请求、文件读取、大规模数据计算等。如果在程序中同步地执行这些任务,会导致主线程被阻塞,整个程序在任务执行期间无法响应其他操作,用户体验极差。异步编程应运而生,它允许程序在执行耗时任务的同时,不影响其他部分的正常运行,提高了程序的效率和灵活性。这里的其他部分通常运行在不同的cpu核上,当在其它核上的任务执行完毕,通知当前线程即可,当前线程可以在这段时间片执行其它的任务。
2024-12-03 19:20:48
688
原创 brynet源码阅读——http组件和wrapper组件
在前面的文章中介绍了brynet网络库中的各个组件,在这篇文章中介绍wrapper组件和http组件。其中wrapper组件是给用户使用使用的封装接口,用户只需要简单设置一些参数就可以搭建一个网络服务器或者客户端。而http组件是brynet中http部分的关键部分,依赖于开源的http_parser.h模块。
2024-12-03 00:26:05
1432
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人