自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 高通C2D硬件加速模块解析与实践

Alpha混合/颜色键控。返回surface_id。

2025-03-04 14:03:34 719

原创 压缩ubuntu虚拟机的空间

从输出结果 Shrink: 19% done. 可以看出,虚拟磁盘的缩减操作已经成功开始执行并正在进行中。成功缩减虚拟磁盘进度。

2025-02-06 15:26:40 187

原创 虚拟机 ubuntu 22.04 识别不到 ttyUSB0

从日志分析,你的 CH340 串口设备确实被系统检测到,并分配了设备节点 /dev/ttyUSB0,但是很快就被 brltty 占用并导致设备断开。brltty 是一个盲文终端服务,可能误认为你的设备是一个盲文终端,从而抢占了设备。

2025-01-10 16:45:07 528

原创 STL源码剖析(侯捷版本) —— 第五章 关联式容器(二)

private:// set 的底层实现为 RB-tree// 红黑树表示 set// iterator 的类型为 const_iteratorset元素有序:插入的元素会根据键值自动排序。元素不能重复set中的元素是唯一的,插入相同的元素会被忽略。public:// 键值类型// 实值类型// 元素类型(键值/实值)// 键值比较函数private:// map 的底层机制 RB-tree// 红黑树表示 mappublic:// map 迭代器map。

2025-01-07 14:50:31 431

原创 STL源码剖析(侯捷版本) —— 第五章 关联式容器(一)

关联式容器通过键值对存储数据,支持高效的查找、插入和删除操作。红黑树底层容器:如setmapmultiset和multimap,它们维护元素的有序性,底层实现使用红黑树。哈希表底层容器:如hash_sethash_map和,使用哈希表底层结构,提供高效的无序操作。红黑树底层容器:维护元素的顺序,提供 O(log n) 的操作复杂度。哈希表底层容器:提供更快的平均时间复杂度 O(1),但不维护元素的顺序,适用于不关心顺序的情况。每种类型的容器根据是否需要维护顺序或仅关注查找效率提供了不同的选择。

2025-01-07 14:25:10 382

原创 Effective C++ 条款55:让自己熟悉 Boost

Boost 是 C++ 开发者不可或缺的工具之一。它为标准库提供了补充,并推动了现代 C++ 的发展。通过熟悉 Boost,可以快速掌握众多高级功能,提高代码质量和开发效率。

2025-01-02 14:29:35 271

原创 Effective C++ 条款54:让自己熟悉包括 TR1 在内的标准程序库

熟悉 C++ 标准程序库和 TR1 的功能,可以极大提高开发效率和代码质量。TR1 的引入为开发者提供了更强大的工具集合,而许多功能在 C++11 及之后的标准中已成为标准库的一部分。通过学习和使用这些库,可以减少重复开发、提高代码的可读性和可靠性。

2025-01-02 14:26:43 370

原创 Effective C++ 条款53:不要轻忽编译器的警告

编译器警告不应被忽视,它们是潜在问题的预警。为了确保代码的稳定性、移植性以及可维护性,应当在编译时设置最高警告级别,并致力于消除所有警告。通过这种方式,能够提高代码的质量并减少由于移植到不同平台而可能发生的错误。

2025-01-02 14:15:54 262

原创 Effective C++ 条款52:写了 placement new 也要写 placement delete

在使用的同时,必须实现相应的,以确保对象被正确销毁且内存不会泄漏。正确地处理内存管理和对象生命周期,能够有效地避免内存问题,提高代码的可靠性。记得不要遮掩标准的new和delete操作符,这有助于保持内存管理的一致性和清晰性。

2025-01-02 14:11:46 372

原创 Effective C++ 条款51:编写 new 和 delete 时需固守常规

编写自定义的new和delete操作符时,遵循一些常规的做法是非常重要的。通过合理处理内存分配和释放时的特殊情况,可以避免内存泄漏、提高代码的健壮性并提升程序性能。特别是在处理大小不一致的内存、空指针和 0 字节申请时,细致的检查和相应的操作是必不可少的。

2025-01-02 14:02:13 278

原创 Effective C++ 条款50:了解 new 和 delete 的合理替换时机

new编写自定义的new和delete操作符是一个有用的技术,特别是在需要优化性能、调试内存错误,或收集内存使用数据时。通过合理替换这些操作符,开发者可以提高程序的内存管理效率,并帮助检测和修复内存相关的错误。然而,在自定义内存分配器时需要小心,以确保其正确性、性能和可维护性。

2025-01-02 13:53:43 291

原创 Effective C++ 条款49:了解 new-handler 的行为

提供了一种灵活的方式来处理内存分配失败的情况。通过设置合适的函数,程序可以在内存不足时采取不同的措施,如释放更多内存、安装新的处理程序,或终止程序。对于现代 C++ 开发者,理解的使用和局限性至关重要,以便设计高效且稳定的内存管理机制。

2025-01-02 13:52:33 343

原创 Effective C++ 条款48:认识 template 元编程 (*)

模板元编程 (TMP) 是一种强大的编程技术,能够将运行期的工作转移到编译期,从而提高性能和检测早期错误。虽然 TMP 提供了巨大的灵活性和定制能力,但它也带来了更高的复杂性和调试困难,因此应谨慎使用,并确保代码的可维护性。

2025-01-02 13:44:49 262

原创 Effective C++ 条款47:请使用 traits class 表现类型信息 (*)

是一种强大的工具,能够在编译期提供类型信息,从而实现类型相关的编译期逻辑。这种技术广泛应用于模板元编程中,使得代码更加泛化和高效。

2025-01-02 10:56:15 326

原创 Effective C++ 条款46:需要类型转换时请为模板定义非成员函数 (*)

在模板设计中,为了支持所有参数的隐式类型转换,建议将相关函数定义为模板类内部的友元函数。这样可以充分利用模板的灵活性,同时确保类型转换的正确性。public:private:// 定义一个支持隐式类型转换的友元函数通过在模板类内部定义友元函数,可以实现灵活的类型转换支持,同时保持代码的简洁性和易用性。这种方法特别适合需要支持多种参数类型的场景,是模板设计中的一项重要技巧。

2025-01-02 10:47:12 301

原创 Effective C++ 条款45:运用成员函数模板接受所有兼容类型

成员函数模板是一种强大的工具,尤其在需要支持多个类型的类设计中。然而,为了避免潜在的二义性或不必要的代码膨胀,需要慎重设计模板接口,并在需要时保留默认实现以确保代码的稳定性和可维护性。

2024-12-31 10:55:46 330

原创 Effective C++ 条款44:将与参数无关的代码抽离 template

非类型模板参数替换为函数参数或类成员变量以避免生成多余实例。类型模板参数为具有相同二进制表示的类型共享实现,降低代码重复。减少代码膨胀的目标提高程序运行效率。降低代码维护成本。通过将与模板参数无关的代码抽离,可以有效减少代码膨胀,同时保持代码的灵活性和可复用性。

2024-12-31 10:46:09 389

原创 Effective C++ 条款43:学习处理模板化基类内的名称

为何会有问题在模板派生类中,编译器无法在模板未完全实例化时确定基类中的名称是否依赖模板参数。解决方式使用this->。使用基类的资格修饰符(如对嵌套类型使用typename明确其为类型。通过正确处理模板化基类内的名称,可以避免名称解析错误,确保模板代码的正确性和可读性。

2024-12-31 10:26:14 315

原创 Effective C++ 条款42:了解 typename 的双重意义

关键字 在 C++ 中有两种主要用途:标识嵌套从属类型名称当指涉模板中的嵌套从属类型名称时,必须使用关键字 来明确表示该名称是类型,而不是变量或其他实体。声明模板参数在声明模板参数时, 和 关键字可以互换使用。在模板中,当使用嵌套从属类型名称(即依赖于模板参数的类型名称)时,需要在名称前添加 :分析:在声明模板参数时,可以使用 或 ,两者等效:在基类列表和成员初始化列表中,不允许将 用作基类修饰符:总结:必须使用 的场合:不得使用 的场合: 与 的选择:通过正确理解和使用 ,可以有效避免

2024-12-30 16:25:13 399

原创 Effective C++ 条款41:了解隐式接口和编译期多态

模板参数的接口是隐式的,只要模板实例化时所需的操作是可用的,代码就可以编译通过。通过运行期多态提供其实现。通过清晰的函数签名定义,,模板就能正常编译。

2024-12-30 14:55:20 491

原创 Effective C++ 条款40:明智而审慎地使用多重继承

多重继承增加了复杂性,但在某些场景下是必要的。虚继承可以解决菱形继承问题,但也带来了额外的开销。一个常见的合理用法是公共继承接口类和私有继承实现类的组合。在设计中尽量避免过度使用多重继承,如果可以,用复合替代复杂的继承关系。

2024-12-30 14:48:42 1141

原创 Effective C++ 条款39:明智而审慎地使用 private 继承

private 继承适用于描述 “is-implemented-in-terms-of” 关系。与复合相比,private 继承可以直接访问基类成员,但不能隐式转换为基类类型。在需要优化对象尺寸时,private 继承可能优于复合,因为它可以触发EBO。

2024-12-30 14:20:18 749

原创 Effective C++ 条款38:通过复合塑模出 has-a 或 “根据某物实现出”

当描述类之间的包含或实现关系时,应使用复合。复合可以用于表达has-a和的关系。复合提供了更强的封装性,并降低了类之间的耦合性。

2024-12-30 14:07:17 295

原创 Effective C++ 条款37:绝不重新定义继承而来的缺省参数值

在 C++ 中,缺省参数值是静态绑定的(即编译时确定),而 virtual函数是动态绑定的(即运行时根据对象动态类型确定)。这两者的绑定方式不同,可能会导致预期之外的行为。public:private:public:private:// 输出: Drawing Rectangle with color 0 (Red)return 0;缺省参数值是静态绑定的,而virtual函数是动态绑定的,两者的绑定机制不同。不要重新定义继承而来的缺省参数值,因为这会导致代码行为与预期不符。

2024-12-30 13:45:01 347

原创 Effective C++ 条款36:绝不重新定义继承而来的 non-virtual 函数

在 C++ 中,函数并不支持动态绑定。这意味着即使派生类重新定义了基类的函数,调用函数时的行为取决于调用对象的静态类型,而非运行时的动态类型。不要重新定义继承而来的函数,因为它不会实现多态行为。如果需要多态行为,请使用virtual函数。如果确实需要防止某些函数被派生类覆盖,可以将它们声明为final或非虚函数,并明确设计接口。通过清晰区分virtual和函数的用途,可以避免混乱和潜在的错误。

2024-12-30 11:23:55 348

原创 Effective C++ 条款35:考虑 virtual 函数以外的其他选择

通过public非虚函数调用private虚函数。固定了调用逻辑,同时允许派生类覆盖特定的行为。更安全,避免了直接暴露虚函数的潜在问题。函数指针和 std::function用于动态切换策略。相较于虚函数,它们更轻量且更灵活,尤其在需要动态绑定多种行为的场景中。在设计时,应根据具体需求选择最合适的机制,以平衡代码的灵活性和复杂性。

2024-12-30 10:52:28 405

原创 Effective C++ 条款34:区分接口继承和实现继承

接口继承(Interface Inheritance):通过纯虚函数(= 0)实现,派生类必须实现这些函数。实现继承(Implementation Inheritance):通过非纯虚函数(带缺省实现)实现,派生类可以选择重用或覆盖基类的实现。强制性实现继承:通过非虚函数()实现,派生类强制继承并使用基类的实现,不能覆盖。在设计类时,理解这两种继承的区别是非常重要的,正确使用它们可以帮助你更好地设计类的接口和实现,避免不必要的复杂性和错误。

2024-12-27 14:36:17 658

原创 Effective C++ 条款33:避免遮掩继承而来的名称

文章目录条款33:避免遮掩继承而来的名称为什么避免遮掩?如何避免遮掩?1. 使用 `using` 声明式2. 使用转交函数 (Forwarding Functions)总结条款33:避免遮掩继承而来的名称在 C++ 中,派生类(derived class)内的名称会覆盖基类(base class)内的名称。这种行为通常被称为“遮掩”。在公共继承(public inheritance)中,通常不希望这种遮掩发生,因为它会导致基类的成员变得不可访问,这可能会使代码难以理解和维护。为什么避免遮掩?名称

2024-12-27 14:27:34 298

原创 Effective C++ 条款32:确定你的 public 继承塑模出 is-a 关系

公有继承表示 is-a 关系:派生类必须能够作为基类的替代品。派生类应遵循基类行为:不要破坏基类的设计,应在派生类中增加扩展,而不是修改基类的基本行为。避免继承不符合 is-a 关系的情况:如果你发现派生类与基类的行为差异过大,应该重新考虑是否应该使用继承。通过确保继承关系符合 “is-a” 的原则,你的代码将更加健壮,易于理解和维护。

2024-12-27 13:42:49 270

原创 Effective C++ 条款31:将文件间的编译依存关系降至最低

分离接口和实现:通过分离接口和实现,减少了文件之间的依赖关系。引用或指针传递:避免直接传递对象,尽量使用引用或指针来减少拷贝和依赖。声明式替代定义式:尽可能在头文件中只提供声明,避免暴露实现细节。使用 Handle 和 Interface 类:通过 handle 类和接口类设计模式来最小化依赖关系,增强系统的灵活性。减少编译依赖关系是提升大型项目可维护性和编译效率的关键,遵循这些原则有助于构建高效且易于扩展的系统。

2024-12-27 13:36:51 304

原创 Effective C++ 条款30:透彻了解 inlining 的里里外外

使用inline关键字可以提升小型、频繁调用函数的性能。内联的主要优势在于减少函数调用开销,但要小心避免代码膨胀。不要因函数模板出现在头文件中就默认使用inline,而是根据函数的复杂性和使用情况决定是否内联。理解并合理使用inline能够有效提升程序的执行效率并减少不必要的调试难度。

2024-12-27 13:33:36 682

原创 Effective C++ 条款 29:为 “异常安全” 而努力是值得的

目标:努力使函数具有异常安全性,保护资源完整性和逻辑一致性。层次:提供基本承诺、强烈保证或不抛异常保证,视情况而定。技术:通过 RAII、copy-and-swap 和事务性操作实现异常安全。权衡:在性能、复杂性和安全性之间找到平衡点。为异常安全而努力,不仅能提高代码健壮性,也能显著减少调试和维护的成本。

2024-12-27 11:06:46 378

原创 Effective C++ 条款 28:避免返回 handles 指向对象内部成分

避免返回handle指向对象内部成分,保护封装性。使用返回值传递或提供操作接口替代直接暴露内部数据。如果必须返回句柄,应确保它是只读的,且不会导致悬空句柄。通过遵循这些原则,可以提高代码的健壮性和可维护性,同时降低错误发生的概率。

2024-12-27 10:56:50 400

原创 Effective C++ 条款 27:尽量少做转型动作

尽量少做转型动作。避免 C 风格转型,使用 C++ 新式转型。将转型隐藏在函数中,避免在客户端代码中显式转型。优先改进设计,消除对转型的需求。通过遵循这些原则,可以提高代码的安全性、可维护性和效率。

2024-12-27 10:51:47 345

原创 Effective C++ 条款 26:尽可能延后变量定义式的出现时间

程序清晰度将变量的定义尽量延后,靠近其首次使用的地方,有助于提升代码的可读性。程序效率仅在需要时创建变量,可减少不必要的初始化和资源分配。提高代码的可读性,减少潜在错误。在合适场景下改善效率,但需权衡构造、析构和赋值的开销。延后变量定义的原则适用于绝大多数情况下,但也应基于特定场景的性能需求灵活调整。

2024-12-27 10:47:18 374

原创 Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数

【代码】Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数。

2024-12-27 10:10:06 445

原创 Effective C++ 条款24:若所有参数皆需类型转换,请为此采用 non-member 函数

【代码】Effective C++ 条款24:若所有参数皆需类型转换,请为此采用 non-member 函数。

2024-12-27 10:01:27 416

原创 Effective C++ 条款 23:宁以 non-member、non-friend 替换 member 函数

【代码】Effective C++ 条款 23:宁以 non-member、non-friend 替换 member 函数。

2024-12-27 09:45:43 203

原创 Effective C++ 条款 22:将成员变量声明为 private

更具封装性,因为派生类可以直接访问成员变量,破坏封装原则。是面向对象设计的重要原则,有助于保持封装性。

2024-12-26 16:46:10 331

原创 Effective C++ 条款 21:必须返回对象时,别妄想返回其 reference

对象,而不是返回一个指向临时对象的指针或引用。这种方式既直观又安全,依赖编译器优化,不会导致性能损耗。当必须返回一个对象时,建议。,这样可以依赖编译器的。上述代码返回了一个新的。

2024-12-26 16:42:50 234

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除