
C++
文章平均质量分 77
飞鼠_
这个作者很懒,什么都没留下…
展开
-
详解c++中万能引用、完美转发、类型推导
值继续看这章之前建议先了解右值的概念,可以看右详细介绍右值。原创 2025-03-28 14:04:45 · 796 阅读 · 0 评论 -
详解c++中的可调用对象,std::function、Lambda表达式、std::bind等
可调用对象用处广泛,比如在使用一些基于范围的模板函数时(如 sort()、all_of()、find_if() 等),常常需要我们传入一个可调用对象,以指明我们需要对范围中的每个元素进行怎样的处理。又比如,在处理一些回调函数、触发函数时,也常常会使用可调用对象。()等。上面演示了最简单的可调用对象。原创 2025-03-27 21:06:31 · 989 阅读 · 0 评论 -
详解c++的类型转换,static_cast、dynamic_cast、const_cast、reinterpret_cast运算符
c中变量的数据类型可以强制转换为其他数据类型。但由于这种C风格的类型转换可能会出现一些问题,即过于松散的情况和因此 C++ 提出了更加规范、严格的类型转换,添加了四个类型转换运算符,进而更好的控制类型转换过程。原创 2025-03-27 17:37:32 · 615 阅读 · 0 评论 -
详细讲解c++中线程类thread的实现,stl源码讲解之thread
本节我们来详细介绍一下c++中的线程类thread,在讲解的过程中会用到大量模板的知识,可以去看是一个 SFINAE(Substitution Failure Is Not An Error)技巧,用于禁止使用thread对象作为可调用对象来构造新的thread对象。原创 2025-03-26 21:49:59 · 756 阅读 · 0 评论 -
c++手撕协程库,实现生成器与自定义可等待对象
Context定义了我们用到的14个寄存器,而swap_context函数就是我们代码层面用来调用汇编的接口,这个函数只有声明没有定义,在连接阶段会将汇编代码与当前的声明合并,详细的c++编译过程可以看。协程是用户态的线程,它需要由程序来进行调度,如上下文切换与调度设计都需要程序来设计,并且协程运行在单个线程中,这就成就了线程的低成本,简单讲协程就是一种可以被挂起与恢复的特殊函数。你可以简单的理解为就是一个函数名,冒号后面是函数的运行逻辑,我们分为两部分保存于恢复之间用换行分隔,原创 2025-03-25 17:29:37 · 917 阅读 · 0 评论 -
详解c++20的协程,自定义可等待对象,生成器详解
自定义可等待对象需要满足特定的接口要求,主要涉及和这三个成员函数。:用于判断是否可以立即恢复协程的执行。若返回true,协程会马上恢复;若返回false,协程就会被挂起。:在协程挂起时调用,这里可以执行异步操作。在示例中,使用一个新线程来模拟异步操作,操作完成后恢复协程。:在协程恢复执行时调用,返回异步操作的结果。return 42;});// 输出: 42return 0;原创 2025-03-24 23:18:15 · 1196 阅读 · 0 评论 -
c++简单实现redis
本节我们一步一步实现redis的基本数据类型,redis的数据类型讲解可以看核心redis类的实现我们通过这个类来控制整个redis系统,这是一个单例类,commandTypes是各个设计命令对应的类型,比如set对应string,hset对应hash,redis这个成员变量是所有的键值对,这个函数继承了一个单例模板类,我们通过you hao,它只对外开放一个command接口,参数和返回值都是一个字符串,下面是具体实现。原创 2025-03-20 20:26:41 · 1067 阅读 · 0 评论 -
c++实现单例模板类
上面就是我们单例模板类的全部类,很简单的实现GetInstance函数用来获得实例,如果你是c++11以下的版本,你可以需要额外做一下线程安全,因为在c++11之前static是不保证线程安全的,我们delete掉了移动构造和移动赋值函数,确保类的唯一形,我们还将构造与析构函数设置成为了protected,这确保了在代码中我们无法构造单例类。今天我们来实现一个懒汉式的单例模板类,我们只需要继承这个类就可以实现单例,懒汉式是在第一次被使用时才进行初始化,这叫做延迟初始化。原创 2025-03-20 17:09:54 · 163 阅读 · 0 评论 -
详解c++的编译过程,如何从源文件到可执行文件到
本节详细介绍c++的编译过程,c++从代码到可执行文件有四个阶段:我们可以使用这一命令进行预处理,预处理后的文件还是文本文件可以打开查看以.i为结尾这一阶段主要处理以井号#开头的代码,比如, , ,对代码进行一个初步的处理,并且会把所有注释删除,通过#include将头文件的实际内容放入当前文件中,主要有两种格式 或 ,对于尖括号的格式,编译器会在默认的头文件搜索路径(通常是标准库头文件所在的系统目录)中查找指定的头文件。例如像、这样的标准库头文件,通常使用尖括号来引用,对于双引号格式,编译器会优先在当原创 2025-03-16 15:40:53 · 1190 阅读 · 0 评论 -
c++详解模板泛型编程,详解类模板的实现为什么不能放在cpp文件
泛型编程是一种编程范式,它允许程序员编写与类型无关的代码,从而在编译期确定具体的类型。我们通过模板编写一个函数可以让编译器,自动生成对应类型的实现,这大大减少了重复代码的出现,还提高了代码的可维护性和可扩展性,很重要的一点是模板有特性。原创 2025-03-15 22:37:58 · 850 阅读 · 0 评论 -
c++异常处理简单介绍 try catch throw三者的作用
c++中通过try catch throw这三个关键字处理异常,我们为什么要处理异常呢,为什么要用专门的异常处理来处理异常呢,这是本文将要解决的几个问题,我们会一一解答疑惑,异常处理的主要作用是,让我们的程序更健壮,当遇到不可预测的问题时可以做出处理,而不是直接崩溃,当发送错误时可以让程序执行备选方案,如果不得不接受程序时可以提前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。原创 2025-03-15 17:03:21 · 284 阅读 · 0 评论 -
c++详解移动语义,右值引用与move函数的作用,noexcept关键字在移动构造与移动赋值运算符中的重要性
这是c++ 11新添加的特性,设计的目的是为了避免不必要的拷贝开销,通过提升性能,它可以在不拷贝的情况下移动大型资源,它所做的就是将现有资源的所有权交给其他对象,而传统的拷贝需要进行一次内存分配这是很大的开销,移动语义相较于拷贝性能提升相当明显,移动后的源对象处于,即保证可安全析构和重新赋值,但具体成员值由实现决定(可能为空、残留值等)。继续访问其值前必须先重置状态。原创 2025-03-14 19:27:20 · 449 阅读 · 0 评论 -
c++智能指针详解,如何防止循环引用
智能指针是c++ 11标准,添加的用于管理内存资源的类,通过智能指针我们可以,轻松的对内存进行分配与释放,这使得我们不再需要,为手动管理内存的繁琐而烦恼了,主要有三个智能指针,分别是unique_ptrshared_ptrweak_ptr,我们下面一一介绍我们先来看看智能指针的基本使用上面这一部分代码,如果没有智能指针是不可以出现~Test析构的,而使用了智能指针后当func1函数退出时,我们创建的资源就自动被释放了,这就是智能指针的魅力,利用RAII思想完美实现资源的管理,真的非常方便且高效。原创 2025-03-13 22:06:04 · 1038 阅读 · 0 评论 -
详解c++中的const关键字
c++中const关键字可以实现将一个变量或者函数,限定为只读不可进行修改的功能,它的作用是很大的,const可以避免程序员在代码中意外修改某些本应保持恒定的值,并且它还可以限定指针或引用,使其无法通过它们修改所指向的对象,通过const,可以增强代码的安全性和可读性,明确标识出不应被修改的部分,同时编译器会强制检查这些约束。下面再仔细讲讲,const在c++的各种应用。原创 2025-03-13 19:18:04 · 388 阅读 · 0 评论 -
C++基础内存管理讲解,如何避免常见的内存问题,堆栈内存讲解
内存管理是c++变成中很重要的一环,这是编写高效可靠c++的必要条件,这也是c++与其他高级语言最大的区别,其他的语言都提供了高级的gc机制,而c++没有这就难住了很大一部分人了,对于高手来说这是高效程序的关键,对于菜鸟这就是噩梦啊,经常出现的野指针,忘记delete的内存严重影响了运行与开发效率。原创 2025-03-12 22:58:21 · 626 阅读 · 0 评论 -
详解C++中的抽象类与虚函数表的实现
我们创建了两个派生类,通过输出可以看到a1和a2都输出了自己的名字,而a1调用test输出的是基类test的函数,实现这种现象是因为c++中的虚函数表,虚函数表是一个存储虚函数指针的数组,每个类(含虚函数的类)会生成一个虚函数表,每个对象在内存中会通过一个隐式的。具体情况我们看下面的测试。目前基类使用非虚的析构函数,我们运行后会发现只输出了Base destructor,这肯定是不行的我们的派生类没有运行析构,会导致严重的内存泄露。下面我们来使用一下Abstract这个基类。指向它所属类的虚函数表。原创 2025-03-11 18:51:52 · 299 阅读 · 0 评论 -
c++通过RAII思想实现go的defer
RAII是想是c++之父提出的一种自动管理生命周期的思想,使用局部变量来管理动态分配的内容,它充分的利用了C++语言局部对象自动销毁的特性来控制资源的生命周期。go语言中的defer就是这种实现,提前定义一个函数,当作用域结束的时候自动执行,今天我们就来实现这个小功能。上面的功能就实现了最基本的defer功能,在构造时确定函数,析构时执行我们给它的函数,下面测试代码。输出是5511 11完美实现。原创 2025-03-09 22:14:31 · 189 阅读 · 0 评论 -
c++ 手撕线程池
我们先说最基本的workerThread函数,每个线程内部运行的都是它,其内部定义了一个function<void()>用于运行用户提交的任务,一个死循环保证线程不会自己退出,使用条件变量加智能锁实现了线程安全与无任务时让线程阻塞以免浪费资源,cv.wait的作用是当条件不满足时阻塞当前线程并且释放锁,当被唤醒时会重新判断条件,如果为true重新加锁并恢复线程运行,这时候我们将队列内部的任务取出一个在当前线程运行,这里花括号的作用是限制锁的作用域,减少锁的持有时间,避免执行用户任务时持有锁。原创 2025-03-04 16:49:57 · 280 阅读 · 0 评论 -
C++实现工厂模式和注册宏
ProductCreator是我们的映射类型,我们将构造和赋值函数都禁用,默认构造函数设置为私有的这样设置一个单例类,registerClass函数用来注册类,使用时想要一个类的类型参数是类名字符串,内部将一个闭包放入映射中,在创建时就会调用这个闭包来生成类,这里为什么要返回一个short我们后面讲,create很简单传入一个类名,他就会返回对应的类实例,没有就返回空指针。我们并没有实现运行时这一关键点,我们实现的这个必须在编译时就确定的,不能在运行时根据用户的输入或配置文件来决定加载和使用哪些类。原创 2025-02-13 13:33:28 · 359 阅读 · 0 评论 -
手撕shared_ptr 共享指针
今天让我们来手撕c++的共享指针shared_ptr,共享指针的是通过引用计算和RAII思想来实现的,当我们将指针赋值给其他shared ptr时内部有一个计数变量会加1,当shared ptr触发析构时这个计数就会减1,当计数为0时就会自动的释放管理的资源原创 2025-02-11 23:21:05 · 489 阅读 · 0 评论