C++编程专栏
介绍现代C++语法,数据结构,算法,STL用法
黑不溜秋的
GPU全栈博主-程序哥。
展开
-
一文带你掌握C++编程:从入门到精通
本系列文章持续更新中...原创 2024-08-10 13:57:19 · 1193 阅读 · 0 评论
-
C++ STL 随机数用法介绍
目录一:C语言中的随机数二:C++中的随机数 1. 生成随机数的例子 2. 随机数引擎 3. 随机数引擎适配器 4. C++中预定义的随机数引擎,引擎适配器 5. 随机数分布二:C++中的随机数 1. 生成随机数的例子 2. 随机数引擎 引擎 说明 random_device 真随机数(非基于软件生成器),通常用来产生随机种子 linear_congruential_en原创 2024-07-07 14:32:24 · 302 阅读 · 0 评论
-
C++ STL 多线程库用法介绍
【代码】C++ STL 多线程库用法介绍。原创 2024-07-07 11:35:45 · 552 阅读 · 0 评论
-
C++ STL 时间日期用法介绍
C++ 标准库提供了Time Library,它由时间点,时间段,时钟三部分组成,此外,该库还提供了日期功能,日历支持,时区支持,以及输入和输出。原创 2024-07-06 19:12:49 · 246 阅读 · 0 评论
-
C++ STL 正则表达式用法介绍
【代码】C++ 正则表达式(std::regex_search使用)原创 2024-06-18 00:10:01 · 822 阅读 · 0 评论
-
C++编程指南13 - 尽量减少可写数据的共享
数据竞争是多线程编程中常见的一个问题,当多个线程同时访问一个共享的可写数据且至少有一个线程对其进行修改时,就会发送数据竞争。这个规则的核心就是通过减少对可写数据的共享来避免数据竞争。具体来说,如果数据是只读的(用const修饰),那么无论有多少线程访问它,都不会发送数据竞争。常量数据可以在多个线程之间安全地共享,无需额外的同步机制。不可变的数据可以被安全、高效地共享。不可变数据不需要加锁:常量数据不会产生数据竞争。原创 2025-01-13 23:17:48 · 325 阅读 · 0 评论 -
C++编程指南12 - 避免数据竞争
如果不避免数据竞争,程序的行为将无法得到任何保证,潜在的错误可能持续存在。简单来说,如果两个线程可以同时访问同一个对象(没有同步机制),并且至少有一个线程是写操作(执行非const操作),那么就会发生数据竞争。原创 2025-01-12 14:39:54 · 408 阅读 · 0 评论 -
C语言 - 理解函数栈帧
函数栈帧是函数调用过程中为管理和存储函数相关信息(如局部变量、返回地址等)而在栈上分配的一块内存区域。它是实现函数调用、递归和返回的关键机制。原创 2025-01-04 22:47:22 · 375 阅读 · 0 评论 -
C++ 并发专题 - std::promise 和 std::future 介绍
std::promise 和 std::future 是C++标准库的两种工具,主要用于实现线程之间的异步通信。它们属于C++并发库的一部分,提供了一种安全,优雅的方式来在线程之间传递结果或状态。std::promise 用于在线程之间传递值或状态,是一种能够在一个线程中存储值(或异常)的对象。常用方法有以下几种:set_value(value) 设置异步操作的结果,通知关联的std::future.set_exception(ex) 设置一个异常,通知关联的 std::future 发生错误。原创 2025-01-03 23:36:23 · 453 阅读 · 0 评论 -
C++ 并发专题 - 实现一个线程安全的队列
利用 C++ 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列,并且使用多个线程来向队列中添加和获取数据。原创 2024-12-28 23:37:56 · 217 阅读 · 0 评论 -
C++编程指南11 - 假设你的代码将作为多线程程序的一部分运行
在编写代码时,应该预先假设代码会被运行在一个多线程环境中,而不是单线程环境。在多线程程序中,多个线程可能同时访问和修改共享资源,因此需要确保代码在这种情况下能够正确运行。在多线程程序中,多个线程可能同时访问和修改共享资源,因此需要确保代码在这种情况下能够正确运行。即使当前程序是单线程的,未来可能会被扩展到多线程场景。假设代码会在多线程中运行,可以提前避免后续改动时引入的问题。这意味着,在设计类时,确保静态成员和单例模式是线程安全的。在编写全局变量或共享资源时,确保访问方式是原子化的或受到适当保护。原创 2024-12-26 23:35:00 · 375 阅读 · 0 评论 -
C++ 并发专题 - C++线程同步的几种方法
线程同步是多线程编程中的一个重要概念,它用于控制多个线程之间对共享资源的访问,避免竞态条件(race condition)和数据不一致的问题。线程同步确保在多线程环境中,多个线程访问共享数据时能够按照某种预定的顺序或规则进行,以保证程序的正确性和稳定性。原创 2024-12-14 22:36:43 · 368 阅读 · 0 评论 -
C++ 并发专题 - std::latch 介绍
是 C++20 引入的一个同步原语,属于线程同步工具的一部分。它可以用于控制多个线程等待,直到某些事件发生为止,适用于需要等待一组线程在继续之前完成某些操作的场景。可以理解为一种“门闩”机制,它使得多个线程等待,直到达到预定的触发条件。其工作方式类似于一个计数器,线程可以通过。比较适合用于那种固定数量的线程同步的场景(如 N 个线程任务执行完之后才继续进行其他操作)。它通常应用于需要等待多个线程完成某项任务后才能继续执行后续操作的场景。操作使计数器递减,直到计数器达到零时,所有等待的线程才会继续执行。原创 2024-12-06 00:58:25 · 197 阅读 · 0 评论 -
C++ 并发专题 - 使用 std::lock 避免多线程死锁
std::lock是 C++11 引入的一个函数,它可以原子性地锁定多个互斥量(mutex),确保在多个线程竞争锁时避免死锁。它的主要用途是在多个互斥量之间避免因不同线程的不同锁定顺序而导致的死锁问题。原创 2024-12-04 00:01:35 · 421 阅读 · 0 评论 -
C++ 编程指南10 - 如果函数不抛出异常,则应声明为 noexcept
对于那些保证不会抛出异常的函数,应该显式地使用noexcept说明符进行标记。在 C++ 中,异常处理是一种用于处理错误的机制。抛出异常会影响程序的性能,因为它需要进行异常的捕获、传播等操作,尤其是在复杂的异常传播路径中,程序的执行效率会受到较大影响。如果编译器知道某个函数不会抛出异常,它可以做出一些优化决策,避免不必要的异常处理开销。例如,编译器可以更有效地生成代码,避免为了异常处理而插入额外的检查逻辑。通过显式标记函数为noexcept,可以确保在调用这些函数时,程序不会在执行过程中意外抛出异常。原创 2024-11-24 23:09:23 · 452 阅读 · 0 评论 -
C++ 编程指南09 - 如需ABI兼容,则应该使用 C 风格的子集
如果你希望在不同的编译器之间(例如,GCC 和 Clang 或者不同平台之间)共享二进制接口(ABI),那么应该使用 C 风格的子集来编写代码(extern "C")。这是因为 C 语言和 C++ 在 ABI 方面有许多不同,C 语言的ABI通常具有更好的跨编译器兼容性。是应用程序与操作系统或不同编译器之间交互时所遵循的一组规则。它定义了函数调用、参数传递、返回值处理、内存布局等二进制级别的接口。ABI 确保了程序能够在不同的编译器和平台上运行,避免了运行时的不兼容问题。原创 2024-11-24 22:41:30 · 353 阅读 · 0 评论 -
C++编程指南08 - 尽量避免全局对象的复杂初始化
全局对象是作用域为全局的变量或对象,它们的初始化通常发生在代码程序开始运行时。这种初始化可能涉及:动态分配内存、调用非平凡的构造函数、依赖其他全局对象或动态计算结果。复杂初始化 是指全局对象的初始化逻辑超出简单的常量赋值,比如涉及复杂的函数调用、文件操作、动态分配或资源依赖。原创 2024-11-24 22:24:39 · 386 阅读 · 0 评论 -
C++编程指南07 - 不要通过裸指针传递所有权
资源所有权指的是对象或资源(如动态分配的内存、文件句柄等)在程序中的管理权,即:谁负责释放资源?以及谁确保资源的生命周期正确?在 C++ 中,错误管理资源所有权可能导致以下问题:(1)资源泄漏:资源被分配但没有被正确释放。(2)悬空指针:资源被释放后指针仍然被访问。(3)重复释放:多个对象尝试释放同一资源。而裸指针(T*)本质上只是一个地址,它不能表达资源的所有权。原创 2024-11-24 21:58:57 · 191 阅读 · 0 评论 -
C++ 编程指南06 - 不要泄漏任何资源
资源泄漏是指程序在运行过程中分配了某些资源(如内存、文件句柄、网络连接等),但未正确释放或归还,导致这些资源持续占用,无法被其他部分使用。动态分配的内存未释放。打开的文件或网络连接未关闭。锁未正确释放。资源泄漏会导致内存占用增加或系统资源耗尽,最终可能导致程序崩溃或性能问题。原创 2024-11-24 21:32:36 · 333 阅读 · 0 评论 -
C++ 编程指南05 - 编译时检查优于运行时检查
编译时错误检查是C++编程中一条非常重要的原则,它强调了在可能的情况下,应该优先依赖编译时检查(静态检查)而不是运行时检查。这样做的主要目的是提高程序的性能、安全性和可维护性。编译时检查,即在编译过程中,编译器会检查代码中的错误,类型不匹配等问题,并在编译时进行检测。所有的类型安全、语法错误、逻辑错误等都会被编译器在程序运行之前发现并报告。例如,编译器会检查函数参数的类型、变量是否已初始化、数组越界等问题。运行时检查,即是在程序执行过程中,程序运行时进行错误检查或条件判断。原创 2024-11-23 20:45:17 · 510 阅读 · 0 评论 -
C++ 编程指南04 - 尽量编写静态类型安全的程序
尽量使程序在编译时就能保证类型安全,而不是依赖于运行时的检查。这是为了避免潜在的类型错误,提高程序的健壮性和安全性。类型安全指的是在编程过程中,类型的使用必须是合理的,且不能出现不符合规定的类型转换或操作。在静态类型语言(如 C++)中,类型安全意味着编译器在编译时能确保程序中的类型使用是正确的,不会发生类型不匹配的错误。原创 2024-11-23 20:16:48 · 489 阅读 · 0 评论 -
C++ 编程指南03 - 代码应该清晰地表达意图
"Express intent"(表达意图)强调代码应该清晰地表达开发者的意图,使代码更易于理解、维护和扩展。通过编写易于理解和传达意图的代码,开发者能够减少潜在的错误,并帮助团队成员更快速地理解和修改代码。原创 2024-11-23 18:07:48 · 324 阅读 · 0 评论 -
C++ 编程指南02 - 写出符合 ISO C++ 标准的代码
写出符合 ISO C++ 标准的代码,即严格遵循 C++ 语言标准,避免使用编译器特定的扩展或非标准特性。这样做的目的是确保代码的可移植性、可维护性,并减少对特定编译器的依赖。原创 2024-11-23 17:56:06 · 288 阅读 · 0 评论 -
C++ 并发专题 - 线程安全的单例模式
在C++编程中,call_once是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C++11 标准中,是由标准库提供的工具,它与配合使用,能够实现线程安全的一次性初始化。原创 2024-11-18 21:57:51 · 736 阅读 · 0 评论 -
C++ 并发专题 - 内存序介绍(Memory Ordering)
在 C++ 中,内存序(Memory Ordering) 是多线程编程中至关重要的概念,尤其是在处理共享数据时,确保线程间的同步与一致性是非常关键的。C++ 提供了一套机制,允许你控制不同线程对内存的访问顺序,从而保证数据的一致性。内存序的控制主要涉及 原子操作 和 内存屏障(memory barriers)。(松散顺序)解释:不对操作顺序做任何限制。操作可以在任何位置重排,甚至与其他操作无关。场景:只关心原子操作本身的成功与否,不关心其他操作的顺序。在这个例子中,threadA和threadB对x。原创 2024-11-15 18:12:29 · 810 阅读 · 0 评论 -
C++ 并发专题 - 自旋锁的实现(Spinlock)
自旋锁(Spinlock) 是一种用于线程同步的锁,它通过让线程不断地自我检查("自旋")来判断是否可以获得锁,而不是让线程在等待时进入阻塞状态。这种方式使得线程能够在锁被释放之前反复检查锁的状态,从而快速尝试获取锁,而不需要进行上下文切换。原创 2024-11-14 22:12:40 · 437 阅读 · 0 评论 -
C++ 并发专题 - std::async 介绍
std::async是 C++11 引入的一种并发工具,用于异步执行函数并获取其结果。它可以用来启动一个异步任务,该任务会在后台运行,调用者可以在稍后获取任务的执行结果。二:std::async。原创 2024-11-11 23:04:54 · 247 阅读 · 0 评论 -
C++ 判断是不是平衡二叉树
(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。原创 2024-11-07 22:59:15 · 469 阅读 · 0 评论 -
C++ 并发专题 - 条件变量的使用
在 C++ 中,条件变量)是一种用于线程间同步的机制,主要用于在多线程环境中让一个线程等待某个条件满足后再继续执行。条件变量通常配合互斥锁(std::mutex)使用,保证了在访问共享数据时不会发生竞态条件。原创 2024-11-07 22:35:51 · 587 阅读 · 0 评论 -
C++ 并发专题 - 不变式与多线程
在C++中,“不变式”通常是指程序中某些必须始终成立的条件或者规则,破坏不变式(breaking Invariant Solved)的问题通常出现在并发编程中,当多个线程同时操作共享数据时,如果没有正确同步,可能导致数据不一致,进而违反了不变式。在多线程程序中,不变式是指那些在整个程序运行过程中始终需要保持为真的条件或属性。比如:1. 某个变量的值不能超过特定范围。2. 一个计数器的值应该是非负数。3. 某个状态应该在任何时候都保持一致。原创 2024-11-06 23:38:25 · 341 阅读 · 0 评论 -
C++ 并发专题 - 无锁数据结构(队列)
当我们在并发程序中使用队列时,通常会使用锁来同步推入(push)和弹出(pop)操作。我们会在执行推入或弹出操作之前加锁,并在函数结束之前解锁。然而,锁的使用会带来一些开销,包括创建和获取锁的成本。因此,如果我们能够完全避免使用锁,并仍然支持并发操作,那将是非常理想的。对于许多数据结构,如链表、栈和队列,我们可以借助原子操作中的比较并交换(CAS)来实现同步、无锁版本。在 C++ 中,它被称为。CAS 最初是 IBM 在 1973 年引入的 CPU 指令。原创 2024-11-05 22:18:04 · 594 阅读 · 0 评论 -
C++ 并发专题 - 无锁数据结构(概述)
无锁数据结构是一种在多线程环境中实现线程安全的结构,它允许多个线程在没有传统锁机制的情况下并发访问和修改数据。这种设计的目标是提高程序的性能和响应性,避免锁竞争和上下文切换的开销。原创 2024-11-01 21:44:06 · 606 阅读 · 0 评论 -
C++ 并发专题 - 原子等待(atomic wait)
原子等待是 C++20 引入的一个特性,主要用于多线程编程中。它允许线程高效地等待某个原子变量的值变化,而不是使用忙等待(busy waiting),这样可以减少 CPU 资源的浪费,提高程序的性能。原子等待的引入主要是为了提高性能和资源利用率,尤其是在以下场景中:减少上下文切换:传统的等待机制(如互斥锁、条件变量)常常涉及线程的阻塞与唤醒,这会导致上下文切换的开销。原子等待则允许线程在等待时进入休眠状态,避免了这些开销。原创 2024-11-01 21:26:45 · 583 阅读 · 0 评论 -
C++ 模板专题 - 静态分支(if)
模板元编程(Template Metaprogramming,简称 TMP)是一种在 C++ 中使用模板进行编程的技术,它允许在编译时执行计算、生成代码,提供类似脚本语言的功能。TMP 常用于生成高效的代码,避免运行时的计算开销。在高性能编程、类型处理、泛型编程等领域,模板元编程非常有用。模板元编程的一个使用场景就是进行编译器条件分支判断,称为“静态 if”。它允许我们在模板中根据条件编译选择不同的代码分支,而不需要实例化不符合条件的代码,这不仅可以提升编译性能,也可以简化模板代码逻辑。原创 2024-10-31 22:44:59 · 297 阅读 · 0 评论 -
C++ 模板专题 - 静态多态(CRTP)
CRTP(Curiously Recurring Template Pattern)是一种常用的 C++ 模式,用于实现静态多态性。通过 CRTP,可以在编译期确定子类类型,从而避免动态多态性带来的运行时开销。这种模式主要通过让基类接受派生类作为模板参数来实现。原创 2024-10-31 22:10:55 · 353 阅读 · 0 评论 -
C++ 模板专题 - 递归模板
在 C++ 中,递归模板是一种编程技术,允许在编译期通过递归定义模板,生成复杂的类型或计算复杂的表达式。递归模板通常用于元编程,允许在编译期进行类型生成、计算等操作,避免运行时开销。递归模板广泛应用于编译期常量计算、类型列表操作、类型萃取等场景。原创 2024-10-30 23:01:30 · 691 阅读 · 0 评论 -
C++ 模板专题 - 标签分派(Tag Dispatching)
在 C++ 中,Tag Dispatching 是一种编程技巧,主要用于在编译期根据不同的类型或特征选择不同的函数重载或代码分支。Tag Dispatching 借助类型标签(tags)进行函数调度,用于在模板中实现编译期的静态分派。这种方法特别适合在泛型编程中根据类型特性(如迭代器类型、数据结构特性等)选择特定的操作路径。原创 2024-10-30 22:25:05 · 421 阅读 · 0 评论 -
C++ 模板专题 - 模板参数类型推导
在 C++ 中,模板形参的类型指的是在模板定义中声明的参数类型。这些形参在模板实例化时被实际类型替代。理解如何根据实参类型推导模板形参的类型至关重要。左值(Lvalue):表示一个可被取地址的对象,通常指向内存中的一个位置。右值(Rvalue):表示一个临时对象,不能被取地址,通常是常量、字面量或表达式的结果。2. 其次解释下模板形参类型有哪些?T:普通类型模板参数T&:左值引用模板参数T&&:右值引用模板参数const T:常量类型模板参数。原创 2024-10-29 22:26:50 · 518 阅读 · 0 评论 -
C++ 模板专题 - 变长模板
C++ 变长模板(Variadic Templates)允许你定义接受任意数量模板参数的模板。这种功能在 C++11 中引入,非常灵活,常用于实现类型安全的容器、函数等。// 函数体。原创 2024-10-29 21:37:05 · 271 阅读 · 0 评论 -
C++ 模板专题 - 参数约束
除了使用SFINAE对模板参数进行约束之外,还可以使用概念(Concepts)来对模板参数进行约束,确保传入的类似满足特定条件。概念(Concepts)是C++20中引入的,概念是用于指定类型要求的一种机制。它们可以帮助你编写更清晰的代码,通过限制模板参数类型来提高类型安全性和可读性。requires关键字用于定义这些类型要求,是C++20中为概念(Concepts)引入的关键字。原创 2024-10-28 21:45:34 · 195 阅读 · 0 评论
分享