
【道阻且长C++】
文章平均质量分 54
相对来说C++是一门难度较高的编程语言,我自己工作中也一直在使用和学习,总想把自己认为的难点和感悟好好的整理写下来,以期对后来者有帮助,水平有限,多多包涵,本着先完成,再完善的基本原则,刚开始不会那么详细,但会不断地完善
越甲八千
置身其中,全力以赴
展开
-
std::vector<>.emplace_back
(而非拷贝或移动)元素。这一特性显著提升了复杂对象的插入效率,尤其适用于构造代价较高的类型。是 C++11 引入的容器成员函数,用于在容器尾部。:若构造函数抛出异常,容器状态保持不变。不返回新元素的引用(C++17 起。在现代 C++ 编程中,建议优先使用。,除非需要明确的类型检查或兼容性保证。:若容器需要重新分配内存,仍需移动所有现有元素。原创 2025-05-20 23:10:31 · 670 阅读 · 0 评论 -
thread 的mutex优化
std::lock_guard 是 C++ 中用于管理互斥锁的 RAII(Resource Acquisition Is Initialization)工具。它在构造函数中自动加锁,并在析构函数中自动解锁,确保锁的生命周期与对象的作用域绑定。这种设计避免了手动管理锁时可能出现的资源泄漏和死锁问题,尤其在异常情况下仍能保证锁的正确释放。std::lock_guard 的自动解锁机制依赖于 C++ 的作用域规则,局部对象在离开作用域时会自动析构,从而释放锁。相比手动管理锁,std::lock_guard 提供了原创 2025-05-20 22:04:14 · 249 阅读 · 0 评论 -
vector是在栈上还是在堆上
在C++中,std::vector对象的存储位置取决于其定义方式:如果作为局部变量或类的非静态成员变量,则存储在栈上;如果使用new动态分配,则存储在堆上。然而,vector管理的元素始终存储在堆上,因为vector需要动态调整大小,堆内存更适合这种需求。vector使用RAII机制,确保对象析构时自动释放堆上的内存,避免内存泄漏。相比之下,固定大小的数组(如std::array或原始数组)则存储在栈上。总结如下:vector对象本身可存储在栈或堆上,而其元素始终存储在堆上。原创 2025-05-13 16:27:01 · 215 阅读 · 0 评论 -
deque底层数据结构以及和queue的异同
deque(双端队列)是一种高效支持两端插入和删除操作的数据结构,常见于C++标准库(STL)等编程语言。其底层实现采用分段连续存储,结合了数组和链表的优势,既支持O(1)时间复杂度的随机访问,又能在两端进行快速插入和删除。deque由中控器(指针数组)和数据块(固定大小的数组)组成,通过迭代器实现透明的随机访问。与vector相比,deque在两端操作上更高效,且避免了扩容时的元素复制开销;与list相比,deque支持随机访问,但中间插入/删除效率较低。deque适用于需要频繁双端操作和偶尔随机访问的场原创 2025-05-12 00:52:52 · 461 阅读 · 0 评论 -
C++ RAII机制
RAII(Resource Acquisition Is Initialization)是一种编程范式,其核心思想是将资源的生命周期与对象绑定:对象创建时获取资源,对象销毁时自动释放资源。通过构造函数和析构函数的配对执行,RAII确保了资源管理的安全性和一致性。典型应用场景包括智能指针(如std::unique_ptr和std::shared_ptr)、文件操作(自动关闭文件句柄)和互斥锁管理(自动加锁和解锁)。RAII的优势在于异常安全、代码简洁和资源管理统一,避免了手动管理资源时的常见问题。自定义RAI原创 2025-05-11 22:50:03 · 473 阅读 · 0 评论 -
C++ string_view
是C++17引入的一个轻量级、非拥有的字符串视图类,定义于头文件中。它提供了一种高效且安全的方式来处理字符串数据,而无需复制字符串内容。以下是关于。原创 2025-04-14 15:29:25 · 691 阅读 · 0 评论 -
STL新增内容
这些新增内容使得 STL 更加完善和强大,为 C++ 开发者提供了更多高效、便捷的工具。原创 2025-04-01 15:55:35 · 414 阅读 · 0 评论 -
函数参数是定义还是赋值
在函数定义阶段,像里的a和b属于形参,此时它们是一种占位符,用于表明函数接收的参数类型和数量。这其实是在定义函数接口,为函数内部使用这些参数做好准备。从语法层面来看,这是变量的定义过程,只是这些变量没有具体的值。// 函数定义,这里的 a 和 b 是形参的定义。原创 2025-03-27 20:47:06 · 313 阅读 · 0 评论 -
C++ register关键字
关键字的主要作用是建议编译器将变量存储在CPU的寄存器中,而不是内存里。寄存器是CPU内部的高速存储单元,和内存相比,寄存器的读写速度要快很多。要是变量被频繁访问,把它放在寄存器里就能显著提升程序的运行效率。会被频繁使用,所以建议编译器把它存到寄存器中。是C和C++编程语言里的一个存储类说明符。原创 2025-03-27 20:40:22 · 434 阅读 · 0 评论 -
std::variant 和enum的区别
枚举(enum枚举是一种用户定义的数据类型,它由一组命名的常量值组成,这些常量值被称为枚举项。每个枚举项都有一个对应的整数值,默认情况下从 0 开始依次递增,也可以手动指定枚举项的值。示例代码如下:// 定义一个枚举类型RED,GREEN,BLUEreturn 0;是 C++17 引入的一个类型安全的联合体(Union),它可以存储多种不同类型的值,但在同一时间只能存储其中一种类型的值。可以包含任意类型,包括用户自定义类型。原创 2025-03-26 13:44:16 · 495 阅读 · 0 评论 -
堆栈溢出常见原因
堆栈溢出会导致程序异常终止,在开发过程中,需要注意合理使用内存,避免出现上述导致堆栈溢出的情况。可以通过工具来检测内存泄漏和分析堆栈使用情况,及时发现和解决问题。原创 2025-03-25 11:19:53 · 488 阅读 · 0 评论 -
C++ CAS
它通过比较内存中的值和预期值,如果两者相等,则将内存中的值更新为新值;如果不相等,则表示该值已经被其他线程修改,操作失败。整个比较和交换的过程是原子的,即在执行过程中不会被其他线程中断。CAS 即 Compare-And-Swap,是一种用于实现多线程同步的原子操作。CAS 操作通常是由硬件层面提供支持,例如在 x86 架构中,有专门的指令来实现 CAS 操作,这保证了操作的原子性。CAS 操作通常需要三个参数:内存地址(V)、预期值(A)和新值(B)。原创 2025-03-22 10:02:50 · 584 阅读 · 0 评论 -
C++平凡类型和非平凡类型异同
非平凡类型是不满足平凡类型定义的类型。拥有平凡的默认构造函数:即编译器自动生成的默认构造函数,没有用户自定义的默认构造函数。拥有平凡的拷贝构造函数:编译器自动生成的拷贝构造函数,没有用户自定义的拷贝构造函数。拥有平凡的析构函数:编译器自动生成的析构函数,没有用户自定义的析构函数。若一个类型不满足上述任何一个条件,它就是非平凡类型。原创 2025-03-22 09:25:13 · 486 阅读 · 0 评论 -
C++关键字汇总
在C++里,保留关键字是被语言本身赋予特定含义的单词,程序员不能将它们用作自定义的标识符(像变量名、函数名等)。根据不同的C++标准,保留关键字的数量有所不同。原创 2025-03-21 21:33:19 · 1117 阅读 · 0 评论 -
泛型lambda表达式和普通lambda表达式的区别
综上所述,泛型 lambda 表达式和普通 lambda 表达式各有优缺点,应根据具体的使用场景选择合适的 lambda 表达式类型。泛型 lambda 可以用于打印不同类型容器中的元素,增强了代码的通用性。关键字让它可以接受不同类型的参数,既可以是整数,也可以是浮点数。泛型 lambda 既可以用于整数相加,也可以用于字符串拼接。是一个普通 lambda 表达式,它明确指定了两个参数。是一个泛型 lambda 表达式,原创 2025-03-21 10:15:36 · 326 阅读 · 0 评论 -
各种排序汇总
以下将详细介绍常见排序算法的排序过程,并给出对应的 C++ 代码实现。原创 2025-03-20 20:55:59 · 907 阅读 · 0 评论 -
C++ 各种map对比
不是标准 C++ 的一部分,如果你使用的编译器不支持。头文件,代码可能无法编译。原创 2025-03-20 00:14:15 · 1358 阅读 · 0 评论 -
compare_exchange_weak功能
函数会将原子变量的当前值与一个期望值进行比较,如果两者相等,则将原子变量的值更新为指定的新值;如果不相等,则将期望值更新为原子变量的当前值。该函数可能会出现伪失败的情况,即即使原子变量的当前值与期望值相等,操作也可能返回false,但这并不影响其在循环中重试以达到最终的更新目的。原创 2025-03-19 20:58:10 · 468 阅读 · 0 评论 -
compare_exchange_weak 和compare_exchange_strong区别
和都是类提供的成员函数,用于执行原子的比较和交换(Compare-And-Swap,CAS)操作。原创 2025-03-19 14:58:45 · 618 阅读 · 0 评论 -
C++`std::this_thread::yield()
的主要作用是当当前线程暂时没有紧急任务需要执行时,主动让出 CPU 资源,使得其他线程有更多的机会被调度执行。这有助于提高多线程程序的整体性能和响应性,避免某个线程长时间占用 CPU 而导致其他线程得不到及时执行。只是一个建议,操作系统并不一定会立即响应这个请求,它可能会根据自身的调度策略来决定是否让其他线程执行。头文件中提供的一个函数,用于当前线程主动放弃 CPU 时间片,将 CPU 使用权让给其他就绪的线程。函数是每个线程要执行的任务。在每次循环中,线程会输出当前的工作状态,然后调用。原创 2025-03-19 14:47:49 · 370 阅读 · 0 评论 -
C++无锁队列
无锁队列是一种在多线程环境下实现高效数据共享的队列数据结构,它不使用传统的锁机制(如互斥锁)来保证线程安全,而是通过原子操作和内存屏障等技术来实现并发访问的正确性。原创 2025-03-19 14:35:15 · 384 阅读 · 0 评论 -
C++常用多线程模式
C++常用多线程模式原创 2025-03-19 13:59:09 · 723 阅读 · 0 评论 -
C++内存分配方式
时,开发者需要负责确保所提供的内存是合适的,并且在对象不再使用时,要手动调用析构函数来释放资源,以避免内存泄漏和未定义行为。是C++ 中的一种特殊的内存分配方式,它允许在已分配的内存空间上构造对象。是一个指向已分配内存的指针,下面是一个简单的示例,展示了。是可选的构造函数参数列表。是要构造的对象类型,原创 2025-03-19 08:52:49 · 757 阅读 · 0 评论 -
opengl实现晶圆排列
- opengl实现以下功能- 1、用opengl创建一个800*800的窗口- 2、用蓝色创建半径400的圆- 3、在圆内布满2*2的正方形,用绿色线画- 4、鼠标点击正方形,改变其颜色为红色,抬起鼠标回复绿色- 5、点击正方形,输出其中心坐标原创 2025-03-17 20:55:03 · 160 阅读 · 0 评论 -
C++四种新的类型转换
C++ 的四种新类型转换运算符通过明确不同类型转换的目的和方式,提高了代码的可读性和类型安全性,避免了传统强制类型转换可能带来的一些潜在问题。在实际编程中,应根据具体的应用场景选择合适的类型转换运算符。原创 2025-03-17 16:35:25 · 480 阅读 · 0 评论 -
指针常量/常量指针
常量指针(指向常量的指针)定义:常量指针是指指针所指向的对象是常量,不能通过该指针来修改所指向对象的值,但指针本身的值(即存储的内存地址)可以改变。语法:将const关键字放在数据类型之前。例如:指针常量(常量指针)定义:指针常量是指指针本身是常量,一旦初始化后,指针的值(即存储的内存地址)不能再改变,但可以通过该指针修改所指向对象的值。语法:将const关键字放在指针变量名之后。原创 2025-03-17 10:38:12 · 359 阅读 · 0 评论 -
C++虚函数,纯虚函数异同
虚函数在基类中使用virtual关键字来声明的成员函数就是虚函数。其语法形式为在函数声明前加上virtual关键字。例如:public:纯虚函数:在基类中声明的虚函数,并且在函数声明后面加上= 0,就成为了纯虚函数。原创 2025-03-17 10:30:36 · 775 阅读 · 0 评论 -
C++ std::apply
std::apply是 C++17 标准库引入的一个实用函数,它允许你将一个std::tuplestd::pair或者任何支持std::get和的类型(统称为元组式类型)中的元素展开,并作为参数传递给一个可调用对象(如函数、函数对象、lambda 表达式等)。下面从基本概念、使用示例、实现原理和使用场景几个方面详细介绍。原创 2025-03-17 10:04:08 · 420 阅读 · 0 评论 -
C++可变参数容器
可以利用 C++ 的可变参数模板来实现一个简单的可变参数容器。// 可变参数模板类private:public:// 插入元素// 打印元素}, tuple);return 0;原创 2025-03-17 09:59:10 · 271 阅读 · 0 评论 -
静态动态库异同、结构、加载2
DLL 文件中确实存放了可执行指令(机器码),但它还包含数据、资源、导出/导入表等元信息。通过动态链接机制,DLL 实现了代码共享、模块化开发和运行时灵活性,是现代操作系统和应用程序的重要组成部分。是的,静态库(.lib文件,Windows 下)中存放的是编译后的指令(机器码),但它与动态库(.dll)在存储和链接方式上有本质区别。静态库.lib中确实包含可执行指令(机器码),但这些指令在编译时会被复制到最终的可执行文件中。原创 2025-03-16 01:38:30 · 642 阅读 · 0 评论 -
静态动态库异同、结构、加载
lib和.dll。原创 2025-03-16 01:15:50 · 506 阅读 · 0 评论 -
C、C++打印地址用%u
和指针大小相同,但由于不同打印方式的语义和显示格式不同,会导致打印指针地址的结果不一样。是格式控制符,用于以无符号十进制整数的形式输出一个值。打印指针地址不推荐,因为它可能导致结果不符合预期且缺乏可移植性。首先,使用%u编译是不会报错的,在C/C++中,不建议使用。打印地址的问题以及正确的打印地址方式这几个方面详细说明。综上所述,为了保证代码的正确性和可移植性,不建议使用。上面是64位,%u此时就是错的。综上所述,虽然在32位系统中。来打印地址,而应该使用。原创 2025-03-14 10:00:27 · 1391 阅读 · 0 评论 -
VS SDL
SDL 检查通过静态代码分析技术,在编译阶段对代码进行扫描,依据一系列安全规则和最佳实践来检查代码。这些规则是基于微软多年的安全开发经验和对常见安全漏洞的研究制定的,能够检测出代码中可能存在的安全隐患和不符合安全规范的代码模式。未初始化的变量可能包含随机值,使用这些变量会导致程序行为不可预测,甚至引发安全问题。SDL 检查会检测代码中是否存在对空指针进行解引用的操作,并给出相应的警告。SDL 会建议使用更安全的替代函数,如。除了上述提到的缓冲区操作函数,SDL 还会检查其他一些不安全的函数调用,如。原创 2025-03-11 23:15:44 · 844 阅读 · 0 评论 -
双检锁问题
双检锁(Double-Checked Locking,DCL)在早期的 C++ 实现中存在问题,但在 C++11 及以后的标准中可以通过适当的处理来解决这些问题。下面详细分析双检锁存在的问题以及对应的解决办法。原创 2025-03-11 10:40:19 · 636 阅读 · 0 评论 -
C++ using和typedef的异同
/ 定义模板别名return 0;总结typedef:适用于简单的类型别名,但在复杂场景下可读性较差,且不支持模板别名。using:语法更直观,支持模板别名,推荐在现代 C++ 中使用。在 C++11 及更高版本中,建议优先使用using。原创 2025-03-10 14:56:17 · 625 阅读 · 0 评论 -
stl里的deque 中控map 假如用完了,该如何处理
中控map本质上是一个动态数组,数组中的每个元素是一个指针,这些指针分别指向不同的存储块(缓冲区)。每个存储块是一段连续的内存,用于实际存储deque中的元素。当需要向deque中添加元素,而现有的存储块空间不足时,会创建新的存储块,并将其地址记录在中控map中。原创 2025-02-15 15:48:52 · 397 阅读 · 0 评论 -
为何STL里stack queue没有迭代器
在 C++ 的标准模板库(STL)中,std::stack和std::queue。原创 2025-02-15 15:45:25 · 369 阅读 · 0 评论 -
C实现C++多态(静态多态/动态多态)
/ 定义一个基类结构体} Shape;这里定义了一个Shape结构体,其中包含一个函数指针draw,用于指向不同形状的绘制函数。// 绘制圆形的函数// 绘制矩形的函数。原创 2025-02-15 14:54:33 · 376 阅读 · 0 评论 -
C++ lambda表达式
Lambda 表达式的性能和普通函数对象类似,因为它们本质上都是通过函数调用运算符来实现的。由于 Lambda 表达式生成的是内联函数对象,在大多数情况下,编译器可以对其进行很好的优化,使得调用 Lambda 表达式的开销和调用普通函数相差不大。C++ 中的 Lambda 表达式是 C++11 引入的一个重要特性,它允许我们在代码中创建匿名的函数对象,提供了一种简洁且灵活的方式来定义局部的、一次性使用的函数。Lambda 表达式在底层是通过编译器自动生成一个匿名的类(函数对象,也称为仿函数)来实现的。原创 2025-02-06 14:05:28 · 1179 阅读 · 0 评论 -
C++ bind
在C++中,绑定器(Binder)是一种用于将可调用对象(如函数、函数指针、成员函数指针、lambda 表达式等)与其参数进行绑定,从而生成一个新的可调用对象的工具。它允许你将一个可调用对象和其部分或全部参数进行绑定,生成一个新的可调用对象。这个新的可调用对象可以在后续被调用,并且在调用时可以省略那些已经被预先绑定的参数。函数的第一个参数绑定为后续调用时的第二个参数,第二个参数绑定为后续调用时的第一个参数,第三个参数固定为。等,用于表示在后续调用绑定后的可调用对象时,传入的参数将被放置在相应的位置。原创 2025-02-06 13:57:38 · 313 阅读 · 0 评论