
C++
C++学习总结
哎呦,帅小伙哦
这个作者很懒,什么都没留下…
展开
-
深入理解 fnmatch 函数的实现
pattern:这是包含模式匹配的通配符的字符串(例如 *.txt),它指示了要匹配的文件名的模式。string:要进行匹配的文件名或字符串。flags:指定匹配的选项(如是否区分大小写,是否支持正则表达式等)。常见的 flags 包括:FNM_CASEFOLD:忽略大小写。FNM_PATHNAME:仅匹配路径分隔符(通常是 /)的部分。FNM_PERIOD:.只能以明文进行匹配,不可以再使用?或*进行匹配。原创 2025-02-18 23:50:02 · 710 阅读 · 0 评论 -
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 · 746 阅读 · 0 评论 -
C++ 中的 std::timed_mutex 和 std::recursive_timed_mutex
在多线程编程中,互斥锁(Mutex)是用于保护共享资源的重要工具。C++ 标准库提供了多种互斥锁类型,其中 std::timed_mutex 和 std::recursive_timed_mutex 是两种支持超时功能的互斥锁。在阅读FastDDS源码时,发现了这两种类型,以前没有使用过,顺便补盲记录下。原创 2025-02-10 23:43:08 · 845 阅读 · 0 评论 -
学习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 · 684 阅读 · 0 评论 -
Effective C++ 规则49:了解 new-handler 的行为
new-handler 是 C++ 提供的一种强大的机制,允许开发者在内存分配失败时定制处理逻辑。通过全局或类专属的 new-handler,程序可以优雅地应对内存不足的情况。尽管如此,new-handler 的使用需要谨慎。合理地释放资源、避免递归调用以及处理异常是实现一个可靠 new-handler 的关键。原创 2025-01-25 21:50:46 · 539 阅读 · 0 评论 -
Effective C++ 规则48: 认识 Template 元编程
模板元编程是指利用 C++ 的模板机制,在编译期执行某些逻辑运算或代码生成的技术。通过模板元编程,可以在编译阶段完成类型推导、条件分支、递归计算等任务。C++ 语言的模板功能不仅仅是为了解决类型参数化的问题,它还可以在编译期完成大量计算和逻辑操作。原创 2025-01-25 21:50:30 · 547 阅读 · 0 评论 -
Effective C++ 规则53:不要轻忽编译器的警告
这是错的,编译器是在告诉你声明于 B 中 的 f 并未在 D 中被重新声明,这是因为const是函数签名的一部分,这里的D定义了一个新的函数,而不能实现多态。如果忽略这个警告,几乎肯定导致错误的程序行为,然后为了找出这个编译器已经告诉你的错误而进行许多调试。这里希望 D::f()重新定义 虚函数 B::f(),但其中有个错误,B::f() 是个 const成员函数,而 D 不是。编译器可能会发出警告,提示你定义了未使用的变量。这种警告指出使用了未初始化的变量,可能导致未定义行为,可能和编译器有关系。原创 2025-01-25 21:51:47 · 350 阅读 · 0 评论 -
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 · 673 阅读 · 0 评论 -
Effective C++ 规则50:了解 new 和 delete 的合理替换时机
在 C++ 中,new 和 delete 是动态分配内存的核心操作符。然而,直接使用它们有时会增加程序的复杂性,甚至导致内存泄漏和其他问题。因此,了解何时替换 new 和 delete 并选择更适合的内存管理策略,是编写高效、健壮 C++ 程序的关键。原创 2025-01-25 21:51:10 · 784 阅读 · 0 评论 -
Effective C++ 规则47: 请使用 Traits Class 表现类型信息
C++ 是一种静态类型语言,类型的特性在编译期就可以被识别和操作。为了更好地利用编译期信息来编写高效、灵活、可维护的代码,C++ 提供了一些技术来“萃取”或“提取”类型的相关信息。即利用 traits 类来封装和提取类型信息,以便在编译期进行各种类型相关的判断和操作。Traits Class(类型萃取类)是一个用来提取类型信息的模板类。通过 traits class,我们可以在编译期获得类型的各类信息,并根据这些信息在模板代码中进行分支选择或优化。原创 2025-01-25 21:50:14 · 665 阅读 · 0 评论 -
Effective C++ 规则46: 需要类型转换时,请为模板定义非成员函数
支持隐式类型转换:非成员函数允许对所有参数进行隐式类型转换,而成员函数只能对非 this 参数进行转换。提升灵活性:非成员函数可以更好地处理多种操作数的组合。友元函数的封装性:使用友元可以在保持封装的同时,让非成员函数访问类的私有数据。当操作符重载需要支持隐式类型转换时,选择非成员函数更合适,尤其是在模板类中。原创 2025-01-24 17:54:32 · 286 阅读 · 0 评论 -
Effective C++ 规则45:运用成员函数模板接受所有兼容类型
使用成员函数模板可以显著提升类的灵活性和通用性,尤其是在处理与模板参数兼容的其他类型时。这种方法既能提高代码复用性,也能避免不必要的性能开销。规则的核心是:在设计类时,不要把类模板的参数限制得太死,通过成员函数模板,可以让类更适应不同的应用场景,同时保持高效和简洁的代码风格。原创 2025-01-23 20:44:41 · 315 阅读 · 0 评论 -
Effective C++ 规则44:将与参数无关的代码抽离 Templates
模板的主要特点是 泛型化,即为不同的类型参数生成不同的代码。原创 2025-01-23 20:44:21 · 475 阅读 · 0 评论 -
Effective C++ 规则43:学习处理模板化基类内的名称
如果只需访问少量基类成员,this-> 更简洁。如果需要频繁访问基类成员,using 更高效且可读性更强。原创 2025-01-23 20:43:57 · 478 阅读 · 0 评论 -
Effective C++ 规则42:了解typename的用法
当在模板中访问嵌套类型(比如类型别名或类型定义),如果该类型是依赖于模板参数的,就必须使用 typename。public:// 必须使用 typenameT::value_type 是依赖于模板参数 T 的。编译器在解析模板时无法确定 T::value_type 是一个类型还是一个变量,因此需要 typename 明确表示它是一个类型。在模板代码中,嵌套类型名依赖于模板参数时,必须使用 typename。如果编译器能确定类型的性质(非模板依赖),则不需要 typename。原创 2025-01-23 20:43:15 · 552 阅读 · 0 评论 -
Effective C++ 规则41:了解隐式接口和编译期多态
C++ 中的 隐式接口 是指类或者模板中不显式声明为接口的一部分,但仍然可以像接口一样使用的成员或方法。隐式接口通常指那些不显式声明为虚函数的函数或者方法,但在多态上下文中仍然能表现出类似接口的行为。,尤其是 模板类型推导、SFINAE(Substitution Failure Is Not An Error) 技术或者 类型特性(type traits)等编译期机制中。它使得类和函数可以灵活地与多种类型协作,而无需显式继承或声明接口。这里的 Printer 类依赖于类型 T 是否有 print() 方法。原创 2025-01-22 23:50:48 · 725 阅读 · 0 评论 -
学习标准库atomic_base.h中typedef enum memory_order
在多核处理器或多线程环境下,操作系统与硬件会对内存访问进行优化,以提高性能。这种优化有时会导致内存访问的顺序与程序代码中的顺序不一致。为了确保程序中的线程能够以某种可预测的顺序访问共享内存,我们需要通过内存顺序来控制原子操作的顺序和同步。内存顺序主要用于控制原子操作(如 atomic_load、atomic_store、atomic_exchange 等)对内存访问的影响在 C++ 标准库中,memory_order 被定义为一个枚举类型,用来指定原子操作的内存顺序。原创 2025-01-06 21:14:06 · 992 阅读 · 0 评论 -
template<typename Func, typename = void> 在类模板中的应用
template<typename Func, typename = void> 在类模板中的应用,充分体现了 C++ 模板编程的灵活性。通过使用默认模板参数和与 SFINAE 相结合的机制,我们可以实现基于类型特征的模板特化和重载,使得代码更加通用、简洁且具备高度的可扩展性。原创 2024-12-25 19:41:37 · 783 阅读 · 0 评论 -
std::async 和 std::packaged_task
在现代 C++ 中,std::async 和 std::packaged_task 是两个非常重要的工具,能够帮助我们更好地处理并发和异步操作。它们分别代表了异步执行任务的两种不同的方式,但都可以有效地将任务的执行从主线程或调用线程中分离出来,以提高程序的并发性和响应能力。原创 2024-12-20 00:04:33 · 712 阅读 · 0 评论 -
C++ 异步编程的利器std::future和std::promise
在现代计算机系统中,许多任务可能需要花费较长时间才能完成,例如网络请求、文件读取、大规模数据计算等。如果在程序中同步地执行这些任务,会导致主线程被阻塞,整个程序在任务执行期间无法响应其他操作,用户体验极差。异步编程应运而生,它允许程序在执行耗时任务的同时,不影响其他部分的正常运行,提高了程序的效率和灵活性。这里的其他部分通常运行在不同的cpu核上,当在其它核上的任务执行完毕,通知当前线程即可,当前线程可以在这段时间片执行其它的任务。原创 2024-12-03 19:20:48 · 708 阅读 · 0 评论 -
.inl文件介绍
2、 为了确保模板实现对所有编译单元都可见,应该在头文件中包含 .inl 文件。这样,任何包含头文件的源文件都会获得模板的完整实现。inl文件主要用于模板类和函数的实现。如果不涉及模板,通常不需要使用 .inl 文件。对于非模板函数,将实现放在 .cpp 文件中更为合适。1、 .inl 文件是一种用于存放内联函数和模板实现的源代码文件。原创 2024-09-05 23:11:18 · 498 阅读 · 0 评论 -
explicit operator bool() const
如果没有加explicit,代码中有类似if(r1)的语句时,就会隐式的调用operator bool()函数,加上之后,就需要显示的调用否则会编译错误,但是static_cast这种调用感觉怪怪的,虽然 static_cast(r1) 可能看起来有些不寻常,但它是合法和有效的,就是去调用bool运算符,如果是自己写代码,可能不会写这种,但是遇到这种需要能理解。1、在C++中,显式布尔运算符explicit operator bool() const是一种特殊的成员函数,它用于将类对象显式地转换为布尔值。原创 2024-09-02 23:15:15 · 526 阅读 · 0 评论 -
深入理解自旋锁(Spin Lock)
4、优缺点及适用场景。原创 2024-07-03 13:28:22 · 589 阅读 · 0 评论 -
shared_from_this
为了使用 shared_from_this,类需要继承 std::enable_shared_from_this,并在需要生成 std::shared_ptr 的地方调用 shared_from_this。通过继承 std::enable_shared_from_this,类可以利用内部的 std::weak_ptr 来实现这一功能。std::enable_shared_from_this 类模板的内部实现非常巧妙,主要利用了 std::weak_ptr。4、shared_from_this 的实现细节。原创 2024-07-03 13:22:31 · 1023 阅读 · 0 评论 -
std::dynamic_pointer_cast
1、std::dynamic_pointer_cast 是 C++ 标准库中提供的一种智能指针转换方法,用于在继承层次结构中进行类型安全的向下转换(downcasting),类似于普通指针的 dynamic_cast。它接受一个 std::shared_ptr 并尝试将其转换为另一个类型的 std::shared_ptr。如果转换失败,std::dynamic_pointer_cast 返回一个空的 std::shared_ptr。std::dynamic_pointer_cast 在运行时检查类型。原创 2024-07-03 13:22:11 · 648 阅读 · 0 评论 -
一篇文章了解lambda表达式的本质
其实这里就可以看出,值捕获时,编译器会把捕获到的值作为类的成员变量,并且变量是以值的方式传递的。需要注意的时,如果所有的参数都是值捕获的方式,那么生成的operator()函数是const函数的,是无法修改捕获的值的,哪怕这个修改不会改变lambda表达式外部的变量,如果想要在函数内修改捕获的值,需要加上关键字 mutable。一个lambda表达式基本上就是一个函数,但它没有名字。(备注:这里的编译的翻译结果并不和真正的结果完全一致,只是把最主要的部分体现出来,其他的像类到函数指针的转换函数均省略)原创 2024-04-18 23:58:16 · 986 阅读 · 0 评论 -
C++ 就地构造对象
这是因为在C++的内存模型中,当对象被创建(无论是通过新运算符还是其他方式)时,它会占据一片内存,并且在这片内存上运行其构造函数。但是,在使用就地构造时,我们只是在已经分配的内存上直接构造了对象,没有额外的机制来跟踪这片内存或者对象的生命周期,因此,我们需要手动管理这块内存和对象的生命周期。使用placement new要非常小心,确保分配的内存块足够大,并且正确管理对象的生命周期,包括手动调用析构函数和释放内存。此外,在指定内存位置上创建对象时,请确保该位置是合法的、对齐的,并且未被使用。原创 2023-10-07 16:09:05 · 548 阅读 · 0 评论 -
#define XX(a) #a
【代码】#define XX(a) #a。原创 2023-07-03 00:01:18 · 296 阅读 · 0 评论 -
Effective C++ 规则40:明智而审慎地使用多重继承
C++原创 2022-11-15 23:19:11 · 232 阅读 · 0 评论 -
Effective C++ 规则39:明智而谨慎的使用private继承
C++原创 2022-11-14 22:00:31 · 530 阅读 · 0 评论 -
Effective C++ 规则38: 通过复合塑模出has-a或“根据某物实现出”
C++原创 2022-11-13 23:10:26 · 382 阅读 · 0 评论 -
Effective C++ 规则37:绝不重新定义继承而来的缺省参数值
C++原创 2022-11-13 22:58:19 · 121 阅读 · 0 评论 -
Effective C++ 规则34:区分接口继承和实现继承
C++原创 2022-11-13 20:33:13 · 653 阅读 · 0 评论 -
Effective C++ 规则36:绝不重新定义继承而来的非虚函数
C++原创 2022-11-11 23:54:23 · 143 阅读 · 0 评论 -
Effective C++ 规则33:避免遮掩继承而来的名称
C++原创 2022-11-11 23:30:25 · 219 阅读 · 0 评论 -
Effective C++ 规则32:确定你的public继承塑模出is-a关系
C++原创 2022-11-10 23:40:45 · 137 阅读 · 0 评论 -
Effective C++ 规则31:将文件间的编译依存关系降至最低
C++原创 2022-11-10 23:07:14 · 286 阅读 · 0 评论 -
Effective C++ 规则30:透彻了解内联函数
C++原创 2022-11-10 00:10:51 · 357 阅读 · 0 评论 -
Effective C++ 规则29:为“异常安全”而努力是值得的
C++原创 2022-11-09 23:55:56 · 299 阅读 · 0 评论 -
Effective C++ 规则28:避免返回handles指向对象内部成分
C++原创 2022-11-09 00:27:02 · 238 阅读 · 0 评论