- 博客(38)
- 收藏
- 关注
原创 C++实现环形缓冲区
public:// 类型定义 (STL容器要求)提供STL容器标准接口所需的类型定义支持自定义分配器(默认使用std::allocator)template <typename T, typename Allocator = std::allocator<T>>:这是一个模板声明。T是一个模板类型参数,代表环形缓冲区中存储的元素类型。Allocator是另一个模板类型参数,它代表用于分配和释放内存的分配器类型,默认使用std::allocator<T>,这是标准库中提供的通用分配器。
2025-04-08 20:57:18
816
原创 C++11内存池设计与实现深度解析
这里是因为直接调用默认拷贝构造会出现问题,因此重写拷贝构造的接口,实际上用的是委托的默认构造函数,这样即使不小心调用了拷贝构造,最后实际上执行的仍是默认构造,从而避免出现因浅拷贝而出现的问题。这里借助通俗的模型帮助大家理解内存池是怎么运作的。假设我们有一个快递站(内存池),里面有很多货架(Block),每个货架有很多格子(Slot)用于存放快递(要存储的对象),这里假设所有快递占用的空间一样。注意:一个内存池有很多个内存块(block),一个内存块有多个内存槽(slot),内存槽一般就可以用来存储对象。
2025-04-06 17:27:45
859
原创 在 Ubuntu 中使用 pip 安装 Python 包时遇到 “no moudle named” 的问题,而改用 sudo pip 后正常
然后执行 source ~/.bashrc。系统中可能同时存在多个 Python 版本(如。),但某些系统级的 Python 环境(如。可能没有读取权限,导致代码运行时找不到模块。可能关联到不同的 Python 环境。运行,导致模块未安装到正确的环境。root 权限安装,包会被安装到。参数确保包安装到用户目录(,以减少系统污染和安全风险。统一安装到用户目录(推荐)所有用户和程序均可访问。),说明是权限问题。),则是多版本冲突。
2025-03-31 19:43:29
378
原创 arm架构ubuntu设置ibus中文输入法快捷键
死活没反应,搞了挺久就是不成功,不知为何,设置成其他的组合键是可以的,但其他的用不顺手。于是到处寻找其他的设置方法,终于找到了。最近在 jetson agx orin 上刷机,装上 ubuntu 后准备设置中文输入法,按照网上的操作安装。这里我是想把输入法快捷键设置成。按上图所示设置,点击“应用”, 点击“确定”单个 “shift” 键。单个 “shift”
2025-03-31 15:13:51
168
原创 34.C++11新特性之异步线程池
在 C++11 中,虽然标准库没有直接提供线程池的实现,但借助新引入的多线程和异步编程特性,如 std::thread、std::mutex、std::condition_variable、std::future 等,能够轻松实现一个高效的异步线程池。线程池可以预先创建一定数量的线程,将任务添加到任务队列中,然后由线程池中的线程从队列中取出任务并执行,这样可以避免频繁创建和销毁线程带来的开销,提高程序的性能。
2025-03-18 19:16:35
326
原创 33.C++11新特性之线程异步
C++11 引入了一系列用于线程异步编程的新特性,这些特性极大地简化了多线程和异步任务的管理,使得开发者能够更方便地编写并发程序。下面将从std::async、std::future、std::promise 和 std::packaged_task这几个核心组件详细介绍 C++11 的线程异步特性。
2025-03-18 18:59:36
877
1
原创 32.C++11新特性之线程同步原子变量
在 C++11 里,标准库引入了原子变量,这是线程同步的重要工具。原子变量能够让多个线程安全地访问和修改共享数据,避免数据竞争问题,且无需显式使用互斥锁,能提升程序的性能与并发能力。下面从多个方面详细介绍 C++11 的原子变量。
2025-03-18 16:55:38
866
原创 31.C++11新特性之线程同步条件变量
在 C++11 中,标准库引入了条件变量(),它是一种用于线程同步的工具,通常与互斥锁(如std::mutex)结合使用,用于实现线程间的等待 - 通知机制。下面将从多个方面详细介绍 C++11 中的条件变量。
2025-03-18 16:30:55
542
原创 30.C++11新特性之线程同步互斥锁mutex
在 C++11 中引入了标准的线程库,其中互斥锁(mutex)是线程同步的重要工具,用于保护共享资源,防止多个线程同时访问和修改这些资源而导致的数据竞争问题。下面从多个方面详细介绍 C++11 中的互斥锁。
2025-03-18 16:09:05
891
原创 29.C++11新特性之 call_once 函数
std::call_once 是 C++11 引入的一个非常实用的函数,它位于<mutex>头文件中,用于确保某个函数在多线程环境下只被调用一次。这在需要进行一次性初始化操作时非常有用,比如单例模式的初始化、资源的一次性加载等。下面从多个方面详细介绍 std::call_once 函数。
2025-03-18 15:27:54
427
原创 28.C++11新特性之命名空间 - this_thread
在 C++11 中,std::this_thread 是一个命名空间,它位于 <thread> 头文件中,提供了一组用于操作当前线程的实用函数。这些函数允许开发者对当前正在执行的线程进行控制和查询,增强了多线程编程的灵活性和可控性。下面详细介绍 std::this_thread 命名空间中的主要函数。
2025-03-18 15:07:55
343
原创 27.C++11新特性之线程类 thread
C++11 引入了标准线程库,其中类是该库的核心部分,它为开发者提供了一种跨平台的方式来创建和管理线程。下面将从多个方面详细介绍 std::thread 类。
2025-03-18 14:30:45
670
原创 26.C++11新特性之处理日期和时间的chrono库
C++11 引入的<chrono>库为处理日期和时间提供了一套全面且灵活的工具,它将时间相关的操作进行了抽象和封装,使得代码更加简洁、安全且易于维护。下面从几个关键方面详细介绍 <chrono> 库。
2025-03-18 13:42:15
724
原创 25.C++11新特性之智能指针
在某些情况下,默认的删除器(使用delete操作符)可能不满足需求,这时可以自定义删除器。delete p;return 0;在上述代码中,customDeleter是自定义的删除器,当ptr的引用计数变为 0 时,会调用该删除器来释放对象。std::unique_ptr允许使用自定义删除器,当所管理的对象需要特殊的释放方式时非常有用。delete p;return 0;在上述代码中,customDeleter是自定义的删除器,当ptr被销毁时,会调用该删除器来释放对象。
2025-03-18 10:48:39
785
1
原创 24.C++11新特性之非受限联合体
非受限联合体的定义和传统联合体基本相同,只是放宽了对成员类型的限制,允许包含具有非平凡特殊成员函数的类型。// 非受限联合体定义int i;
2025-03-18 09:54:44
656
原创 23.C++11新特性之强类型枚举
Value1,Value2,// ...其中,EnumName 是枚举的名称,UnderlyingType 是可选的底层类型,用于指定枚举值的实际存储类型,默认情况下是 int。
2025-03-17 22:38:58
249
原创 22.C++11新特性之扩展的 friend 语法
在 C++11 之前,friend 关键字主要用于授予类或者函数访问另一个类的私有和受保护成员的权限。C++11 对 friend 语法进行了扩展,主要体现在允许 friend 声明一个模板实例化,这一特性增强了代码的灵活性和可维护性。下面将详细介绍 C++11 扩展的 friend 语法。
2025-03-17 22:21:30
577
原创 21.C++11新特性之默认函数控制 =default 与 =delete
在 C++11 中,=default 和 =delete 是两个非常有用的特性,它们允许程序员对类的特殊成员函数的生成和使用进行更精细的控制,增强了代码的可读性和可维护性。下面分别详细介绍这两个特性。
2025-03-17 22:04:14
522
原创 20.C++11新特性之POD类型
在 C++ 里,POD 是 “Plain Old Data” 的缩写,意思是普通旧数据。在 C++11 之前,POD 类型就已存在,不过 C++11 对其定义和规则进行了更为细致的划分和明确。POD 类型旨在和 C 语言中的数据类型保持兼容,保证数据在内存中的布局和 C 语言里的一致,这有利于在 C++ 和 C 代码之间进行数据交互,同时也能确保对象在内存中的存储形式简单且可预测。
2025-03-17 21:42:28
572
原创 19.C++11新特性之可调用对象包装器、绑定器
在 C++11 中,可调用对象包装器和绑定器是两个非常实用的特性,它们增强了 C++ 在处理可调用对象(如函数、函数指针、成员函数指针、lambda 表达式等)时的灵活性和可复用性。
2025-03-17 21:08:38
703
原创 18.C++11新特性之using的使用
在C++中using用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在C++11中赋予了using新的功能,让C++变得更年轻,更灵活。
2025-03-17 19:40:04
385
原创 17.C++11新特性之列表初始化
在 C++11 之前,初始化对象的方式多种多样,不同的类型和场景可能需要不同的初始化语法,这使得代码的一致性和可读性受到影响。例如,数组可以使用花括号初始化,而对于类对象,可能需要使用构造函数调用的方式进行初始化。C++11 引入了列表初始化(也称为统一初始化),提供了一种统一的初始化语法,能够应用于各种类型和场景。
2025-03-17 19:20:26
620
原创 16.C++11新特性之完美转发
在 C++ 编程中,我们经常会编写函数模板,用于处理不同类型的参数。有时候,我们希望在函数模板中把接收到的参数原封不动地转发给另一个函数,这里的 “原封不动” 不仅指参数的值,还包括参数的左值 / 右值属性以及 const 属性等。在 C++11 之前,很难实现这种精确的参数转发。在这个 forwarding 函数模板中,无论传入的是左值还是右值,arg 都会被当作左值处理,因为它是一个具名变量。这就导致无法根据传入参数的原始值类别(左值或右值)来调用合适的 process 重载版本。
2025-03-17 17:12:44
651
原创 15.C++11新特性之右值引用
右值引用是一种新的引用类型,使用双引号&&来表示。右值引用只能绑定到右值,不能绑定到左值。// 右值引用绑定到字面量(右值)在这个例子中,10 是一个右值,rvalueRef 是一个右值引用,它绑定到了这个右值。
2025-03-17 16:27:48
532
原创 14.C++11新特性之委托构造函数和继承构造函数
如果基类有默认构造函数,派生类继承构造函数后,派生类不会因为继承构造函数而失去自己的默认构造函数(如果没有显式定义)。在上述代码中,派生类 Derived 为了使用基类 Base 的构造函数,需要在自己的构造函数中显式调用,当基类的构造函数较多时,派生类的代码会变得冗长。在修改之后的代码中可以看到,重复的代码全部没有了,并且在一个构造函数中调用了其他的构造函数用于相关数据的初始化,相当于是一个链式调用。:如果基类和派生类都定义了相同签名的构造函数,派生类的构造函数会隐藏基类的构造函数。
2025-03-17 15:37:46
333
原创 13.C++11新特性之常量表达式修饰符-constexpr
C++ 程序从编写完毕到执行分为四个阶段:预处理、 编译、汇编和链接4个阶段,得到可执行程序之后就可以运行了。需要额外强调的是,常量表达式和非常量表达式的计算时机不同,非常量表达式只能在程序运行阶段计算出结果,但是常量表达式的计算往往发生在程序的编译阶段,这可以极大提高程序的执行效率,因为表达式只需要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间。那么问题来了,编译器如何识别表达式是不是常量表达式呢?
2025-03-17 14:47:10
454
原创 12.C++11新特性之Lambda表达式
Lambda 表达式是 C++11 引入的一项重要特性,它提供了一种简洁的方式来创建匿名函数对象,可用于临时的、一次性的函数需求,尤其在使用标准库算法时非常方便。以下从语法、捕获列表、参数列表、返回类型、函数体、使用场景和优缺点几个方面详细介绍 Lambda 表达式。
2025-03-17 14:02:56
876
原创 11.C++11新特性之nullptr
nullptr 是 C++11 引入的一个重要特性,它解决了旧有空指针表示法(0 和 NULL)存在的二义性和类型安全性问题。使用 nullptr 可以使代码更加清晰、安全,避免一些潜在的错误,是表示空指针的首选方式。
2025-03-17 13:03:46
470
原创 10.C++11新特性之基于范围的for循环
C++11 的基于范围的 for 循环为遍历容器和数组提供了一种简洁、直观的方式,减少了代码的复杂度,提高了代码的可读性。通过使用引用和常量引用,可以灵活地处理元素的修改和避免复制开销。但它也有一定的局限性,在需要随机访问或获取元素索引的场景下,传统的for循环仍然是必要的。
2025-03-16 21:51:19
898
原创 9.C++11新特性之自动类型推导
C++11 引入的自动类型推导是一项非常实用的特性,它可以让编译器根据初始化表达式自动推断变量的类型,从而简化代码编写,提高代码的可读性和可维护性。下面从auto和decltype两个关键字来详细介绍这一特性。
2025-03-16 20:25:27
782
原创 8.C++11新特性之noexcept
在 C++ 中,异常处理是一种用于应对程序运行时出现错误或异常情况的机制。在 C++11 引入noexcept关键字之前,主要通过函数声明中的throw关键字来表明函数可能抛出的异常类型。上述声明表示function函数可能会抛出int类型或std::string类型的异常。这种方式虽然能让开发者了解函数可能抛出的异常,但也存在一些局限性,比如无法明确表示函数不会抛出异常,而且在运行时检查函数是否违反异常规范的成本较高。C++11 引入的noexcept关键字,用于。
2025-03-16 18:04:25
623
原创 7.C++11新特性之静态断言 static_assert
在介绍静态断言之前,先简要介绍一下断言是什么。在 C++ 中,断言是一种用于在程序运行时检查特定条件是否满足的机制。它通常用于调试和错误处理,帮助开发者快速定位程序中的问题。断言一般通过assert 宏来实现。在程序运行过程中,assert 会检查给定的条件表达式。如果条件为真,程序继续正常执行;如果条件为假,assert 会中断程序的执行,并在标准错误输出上打印出错误信息,包括断言失败的位置(如文件名、行号等)。这有助于开发者快速确定问题出现的位置,以便进行调试和修复。
2025-03-16 17:30:02
767
原创 6.C++11新特性之数值类型和字符串之间的转换
在 C++11 之前,实现数值类型和字符串之间的转换,往往要借助 sprintf、sscanf 或者 stringstream 等方法,使用起来较为繁琐。而 C++11 提供了一系列新的标准库函数,让数值类型和字符串之间的转换变得更加简便直接。下面为你详细介绍这些新特性。
2025-03-16 16:09:09
595
原创 4.C++11新特性之 final和override
override关键字用于显式声明派生类中的虚函数是对基类虚函数的重写,有助于编译器检查错误,提高代码的可靠性。final关键字用于禁止虚函数被重写或类被继承,有助于控制类的继承层次和虚函数的重写规则。
2025-03-16 14:04:53
337
原创 3.C++11新特性之类成员快速初始化
C++11 引入了类成员的快速初始化特性,允许在类定义时直接为成员变量提供初始值,这一特性使得代码更加简洁,也有助于避免构造函数中重复的初始化代码。下面详细介绍类成员快速初始化的几种情况。
2025-03-16 12:53:39
290
原创 2.C++11新特性之 long long 整型
在 C++11 之前,C++ 标准仅规定了 类型至少和 一样长,但并没有对 的具体长度给出严格定义,这导致不同编译器和平台下 的长度存在差异,可能是 32 位也可能是 64 位。 C++11 标准引入了 类型,它提供了至少 64 位的整数表示范围。这一类型在需要处理大整数的场景中非常有用,比如处理大数据、高精度计算等。同时,还引入了对应的无符号类型 。 类型定义: 和 分别用于定义有符号和无符号的 64 位整数变量。 后缀使用:在给 类型变量赋值时,为了明确指定常量是
2025-03-16 12:07:18
208
原创 1.C++11新特性之原始字面量
在C++11之前如果一个字符串分别写到了不同的行里边,需要加连接符,这种方式不仅繁琐,还破坏了表达式的原始含义,比如这里会将所有字符串输出到一行中,而不是输入时多行字符串呈现的样子。如果使用原始字面量就变得简单很多,很强直观,可读性强。“原始字符串”必须要用括号括起来,且其前后的“xxx“字符必须一致,对于这里的原始字面量,
2025-03-15 21:09:50
205
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人