前言 在现代 C++ 编程中,智能指针是管理资源、避免内存泄漏的核心工具。...第二部分:intrusive_ptr 的巧妙机制——参数依赖查找(ADL) boost::intrusive_ptr 的实现方式是 C++ 模板编程中一个非常精妙的范例。...(或其模板参数、其成员类型等)所关联的命名空间。...第三部分:std::make_shared 的退化——内存分配的约束 std::make_shared 是 std::shared_ptr 生态中至关重要的优化。...这种约束确保了 std::make_shared 的实现模板在面对标准类型时是高效且可预测的,同时将复杂性和运行时开销推给了自定义删除器场景,符合 C++ 的 “不为不用的特性支付成本” 这一设计哲学。
然而接口是面向对象编程当中的重要组成部分,也是新手需要学习的重要思维,虽然 C++ 并不那么面向对象。...首先要讲两个概念: 一、纯虚函数 (Pure Virtual Function): 1,纯虚函数只有函数名、参数、返回值类型。...演示讲解部分 ?...编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。...【Example】C++ 接口(抽象类)概念讲解及例子演示 【Example】C++ 虚基类与虚继承 (菱形继承问题) 【Example】C++ Template (模板)概念讲解及编译避坑 【Example
什么是 std::owner_lessstd::owner_less 是 C++ 标准库中的一个函数对象,其核心功能是比较智能指针(如 std::shared_ptr 和 std::weak_ptr)的所有权关系...所谓透明性,指的是它允许参数类型从上下文中自动推导出来,而不需要显式指定模板参数。这使得 std::owner_less 可以接受任意类型的智能指针作为参数,大大提高了代码的灵活性。...std::owner_less 可以直接接受 std::shared_ptr 和 std::weak_ptr 作为参数,而不需要显式指定模板参数,类型会自动推导。...最佳实践4.1 避免直接比较智能指针的值直接比较智能指针的值可能会导致意外的行为,尤其是在它们指向同一个对象的不同部分时。...透明版本可以自动推导参数类型,避免了显式指定模板参数的麻烦,提高了代码的灵活性和可读性。4.3 结合容器使用当使用智能指针作为容器的键时,std::owner_less 是一个非常合适的选择。
C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。 先讲 “部分的” 泛型编程概念的实现方式:模板。 什么是模板?...利用模板,您可以定义类或函数的操作,并允许用户指定这些操作应使用的具体类型。 总结:模板是 C++ 当中支持参数类型与返回值动态化的工具,使开发人员可以动态自定义函数、类中参数与返回值类型。...成员函数可以是函数模板,并指定附加参数。 ...当模板类需要被使用的时候,如何进行声明并创建呢?...那么该如何使用呢?
库的编译链接 如何给一个高速行驶的汽车换轮胎(实现一个可扩展c++服务) 3 STL Traits 技术 4 新特性 if constexpr 5 新特性 面试题:C++中shared_ptr是线程安全的吗...6 模板 C++17 新特性 std::optional 7 class c++类的成员函数,能作为线程的参数吗 8 编译器 const 如何保证const不变 9 值语义 一道面试题看深拷贝构造函数问题...• 如何提炼这样的代码,消除重复,把它们合众为一呢? • 传统C++中的模板技术就是为解决这个问题而设计的,现代C++将其发扬光大,去 除约束,增加功能,使其成为现代C++语言的一大亮点。...• 对于希望深入掌握C++的开发者而言,理解模板是进阶C++编程的必经之路。...从泛 型编程(Generic Programming)、模板元编程(Template Metaprogramming),到C++20 概 念(Concepts),这些技术都在现代C++开发中占据了重要地位
除了显而易见的减少实例化类型的数量(实际业务场景下其实大部分减不了),「本文主要是提供适用于一些具体场景、可实际操作的优化策略以减少C++模板代码的大小。」...将模板函数的通用部分提取出来 如果模板函数中有一部分代码与模板参数无关,那么可以将这部分代码提取出来,放到一个非模板函数中。这样,这部分代码只需要生成一次,而不是在每个模板实例中都生成一次。...: 例如,在我们的例子中,getService() 函数最简单的版本可能长这样,显然,一大部分代码是与模板参数无关的,可以提取出来: class ServiceCenter { public:...)子类的共用部分,挪到(少模板参数的)基类 如果基类也有模板参数,那么应尽量使基类的模板参数比子类少,并把子类的共用部分挪到基类。...更详细的分析可参考 Effective C++ 44:将参数无关代码重构到模板外去。
引言C++11 作为 C++ 语言发展历程中的一个重要里程碑,引入了众多新的特性和库,为开发者带来了更强大的功能和更高效的编程体验。...这些新库特性不仅提升了代码的可读性、可维护性和性能,还使得 C++ 能够更好地适应现代软件开发的需求。本文将带领小白开发者从入门到精通,深入了解 C++11 新的库特性。...other.data_ = nullptr; // 转移资源所有权 }private: char* data_; size_t size_;};完美转发完美转发是指在函数模板中...模板增强变长参数模板C++11 引入了变长参数模板,它允许模板接受任意数量和类型的参数。template 参数模板为模板编程提供了更大的灵活性,使得我们可以编写更加通用的模板函数和类。
作用是对C++中的可调用对象进行包装,例如普通函数、成员函数、模板函数、静态函数、lambda表达式等。 它的最基本的作用是,简化调用的复杂程度,统一调用的方式。...如果代码中混杂着大量普通函数、模板函数、lambda,使用 std::function 是非常有必要的。...因此,function 与 bind 结合后,便成为了 C++ 中类成员函数作为回调函数的一种规范的实现方式。...同样使用 std::placeholders::_* 依次向后推。...3,允许同一 bind 表达式中的多重占位符(例如多个 _1 ),但结果仅若对应参数( u1 )是左值或不可移动右值才良好定义。
总结unique_ptr 通过独占所有权模型,提供了一种简单、高效且类型安全的方式来管理动态资源,是现代 C++ 中避免内存泄漏的首选工具。...share_ptrshared_ptr 是 C++ 标准库中的智能指针,用于管理动态分配的对象,并通过引用计数实现共享所有权。...:make_shared(42);// 直接构造(需显式使用 new)std::shared_ptr ptr2(new int(42));// 从 unique_ptr 转移所有权(...它是现代 C++ 中管理共享资源的核心工具之一。...,实现引用计数的共享所有权 // 模板参数T为指针指向的对象类型 template class shared_ptr { public: /
导语: C++指针的内存管理相信是大部分C++入门程序员的梦魇,受到Boost的启发,C++11标准推出了智能指针,让我们从指针的内存管理中释放出来,几乎消灭所有new和delete。...在C++中,创建数组有很多方法,如下所示: // 静态数组,在编译时决定了数组大小int arr[10]; // 通过指针创建在堆上的数组,可在运行时动态指定数组大小,但需要手动释放内存...,推荐做法,更符合工厂模式,可以连代码中的所有new,更高效;方法的参数是用来初始化模板类shared_ptrsp2 = make_shared(10); 禁止使用指向shared_ptr...使用栈对象管理堆对象 在C++中,内存会分为三部分,堆、栈和静态存储区,静态存储区会存放全局变量和静态变量,在程序加载时就初始化,而堆是由程序员自行分配,自行释放的,例如我们使用裸指针分配的内存;而最后栈是系统帮我们分配的...shared_ptr引用计数的原理 一开始笔者以为引用计数是放在shared_ptr这个模板类中,但是细想了一下,如果这样将shared_ptr赋值给另一个shared_ptr时,是怎么做到两个shared_ptr
这章对优化C++代码的编写有很大意义,值得好好理解。至此第二部分"C++标准库"就看完了,下一篇是第二部分简单的总结,然后就是第三部分了。...+中由new进行分配,由delete进行释放 为了优化动态内存的管理,标准库在头文件memory中定义了两个智能指针:允许多个指针指向同个对象的shared_ptr,指针独占对象的unique_ptr,...和容器类类似,智能指针也是模板类 12.1.1-12.1.4 shared_ptr 通常讲到C++的智能指针就是指shared_ptr,其操作如下 ?...智能指针的优势在于它帮用户管理了关于动态内存对象的引用和销毁 最方便的使用动态内存的方式是调用make_shared函数,它使用参数args初始化类型为T的对象并返回指向这个对象的智能指针,当我们想要用...// do sth delete inp; } int main() { // 第二个参数传入此可调用对象 auto p = make_shared<int
比如,如何将训练好的 AI 图像算法模型,快速部署落地到实际应⽤场景中呢?...一、介绍 VideoPipe 这是一个用于视频分析和结构化的框架,采用 C++ 编写、依赖少、易上手。...::vp_screen_des_node>("screen_des_0", 0); // 推流展示 auto rtmp_des_0 = std::make_shared部分: 读取流:从⽹络或本地机器获取视频流。 解码:将字节流解码为帧,因为算法只能作⽤于图像。...3.5 如何实现新的 Node 类型 首先 vp_node 是 VideoPipe 中所有节点的基类,我们可以定义一个从 vp_node 派生的新节点类,并重写一些虚函数: handle_frame_meta
Boost库已被广泛应用于许多不同领域的C++应用程序开发中,如网络应用程序、图像处理、数值计算、多线程应用程序和文件系统处理等。...; std::system("pause"); return 0; } 一般在默认情况下object_pool内存池只能接收三个以内的参数传递,当读者需要使用多于三个参数时则需要使用自定义可变参数模板来实现功能...,我们以接受四个参数为例,定义construct模板并在该模板内部实现分配资源。...uage_, string usex_) { uuid = uuid_; uname = uname_; uage = uage_; usex = usex_; } }; // 定义可变参数模板...该指针采用了惯用法,即将引用计数器作为自定义类型的一部分存储在实例中。因此,使用intrusive_ptr时,需要为自定义类型提供一个内部引用计数器的实现。
一、引言模板是 C++ 最强大且最复杂的语言特性之一。它不仅支持泛型编程,使函数和类适用于多种类型,还为编译期计算、类型推导和元编程奠定了基础。...在现代 C++ 中,模板与 STL、智能指针、并发库等紧密结合,是高性能、可扩展库开发的基础。...本文将全面介绍 C++ 模板机制,从语法基础、类模板、函数模板、特化与偏特化到模板元编程(TMP),最后通过实战案例演示如何将模板用于解决复杂问题。...4.1 多个模板参数cpp复制编辑template class Pair {public: T first; U second;};4.2 模板默认参数...从基础的函数模板、类模板,到特化、偏特化,再到复杂的元编程与类型萃取,模板为 C++ 提供了独特的表达力。掌握模板,需要不断实践与抽象能力的提升。
RAII 的应用场景 内存管理:例如,unique_ptr 和 shared_ptr 是 C++ 中的智能指针,它们的实现就是基于 RAII 模式,自动管理内存资源。...C++标准库中的智能指针都在 这个头文件下,智能指针主要有 auto_ptr、unique_ptr、shared_ptr 和 weak_ptr 等。...不过要注意的是传定制删除器给 unique_ptr ,是传给模板参数,其构造参数也要传。...> up2(new Date[5]); //函数指针作删除器,既要传模板参数也要传构造参数 unique_ptrmake_shared make_shared 也是一个函数模板,用于创建共享指针,可以接受任何类型的参数,并返回一个指向该类型对象的共享指针。
准备C/C++面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种与C/C++编程相关的问题,这将有助于你在面试中脱颖而出。...内存泄漏(类似避免野指针一样) 内存泄漏是指在计算机程序中,动态分配的内存没有被释放,导致持续占用系统内存。 C++使用new分配内存后,应该使用delete释放内存。...(); shared_ptr node2 = make_shared(); node1->next = node2; // node1 引用 node2...遇到过程序崩溃的情况吗,如何优化程序(单独写) 参考链接:程序崩溃与优化 sizeof 参考链接: sizeof与strlen C++ 新特性 自动类型推断:使用auto关键字可以让编译器推断变量的类型...可变参数模板:引入可变参数模板,允许编写泛型代码以处理可变数量的参数。 std::tuple:引入元组数据结构,用于组合不同类型的数据。
Boost库已被广泛应用于许多不同领域的C++应用程序开发中,如网络应用程序、图像处理、数值计算、多线程应用程序和文件系统处理等。...; std::system("pause"); return 0;}一般在默认情况下object_pool内存池只能接收三个以内的参数传递,当读者需要使用多于三个参数时则需要使用自定义可变参数模板来实现功能...,我们以接受四个参数为例,定义construct模板并在该模板内部实现分配资源。...int uage_, string usex_) { uuid = uuid_; uname = uname_; uage = uage_; usex = usex_; }};// 定义可变参数模板...该指针采用了惯用法,即将引用计数器作为自定义类型的一部分存储在实例中。因此,使用intrusive_ptr时,需要为自定义类型提供一个内部引用计数器的实现。
在现代C++中,智能指针是资源管理的基石。它们不仅是RAII思想的优雅实现,更蕴含着精巧的设计哲学和性能考量。...在典型的实现中,它的运行时开销与裸指针完全相同。所有的安全检查(如析构)都在编译期通过模板和内联确定。...控制块的创建时机:通过std::make_shared:最优方式。在单次内存分配中同时创建控制块和对象。内存局部性最好,效率最高。通过裸指针构造:如果传入裸指针(e.g....//node2被销毁(use_count从1->0)//然后node1被销毁(use_count从1->0)weak_ptr::lock()的工作原理:收起代码语言:C++运行AI代码解释std::shared_ptr...动态分配:至少需要一次(make_shared)或两次(从裸指针构造)堆内存分配。堆分配是昂贵的操作。
本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。...避免不必要的模板实例化 模板不要随便实例化,实例化过多模板,或者模板代码多于必要的数量,会增加编译代码的大小和构建时间。...更多示例请参考: Template Code Bloat Revisited: A Smaller make_shared[2] 避免递归模板实例化 递归模板实例化可能会给编译器带来很大的负担,并且代码更加难以理解...在可向量化操作中,如果能够牺牲精度,float可能更快。 double是C++中浮点值的默认类型,因此推荐作为默认选项。...in_place_t及相关内容 知道如何使用in_place_t和相关标签高效创建诸如std::tuple、std::any和std::variant等对象。
在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。...2,作为函数参数传递时,请传递引用。因为作为值传递时,将产生大量无意义的引用计数。 3,共享所有权性质的对象往往比限定作用域的对象生存时间更久、资源开销更大,尤其是多线程下。...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。...】C++ Template (模板)概念讲解及编译避坑 【Example】C++ 标准库 std::thread 与 std::mutex 【Example】C++ 标准库多线程同步及数据共享 (std