起个别名
这个作者很懒,什么都没留下…
展开
-
一文带你搞懂C++11的并发编程工具: std::future 和 std::packaged_task
得到任务的返回结果的一个封装,类型即为future,通过get方法得到真正的结果,此时肯定是阻塞返回,也就是要等到线程把任务执行完,获取任务执行完的结果后,用户线程这里才会接收到。用户提交任务、线程执行任务、用户获取任务返回结果这是异步的过程,所以针对这样的问题:线程池分配线程执行任务得到结果,这个结果类型是不定的,线程池只能使用一种通用的类型来接收结果,可以看我这篇。都是 C++11 中引入的并发编程工具,用于在多线程环境中进行任务的管理和异步执行。原创 2024-05-26 19:12:32 · 287 阅读 · 0 评论 -
C++进阶四:C++模板编程
模板代码只能同一实现,不能先声明,再在另一文件实现,模板代码都是放在头文件当中的,在头文件中直接实现。原创 2024-06-07 15:58:27 · 112 阅读 · 0 评论 -
C++进阶三:类和对象的细节原理
面向对象四大特性::抽象是一种将对象的共同特征提取出来并定义成一个通用模板的过程。类的抽象是指将一个类的共同属性和行为抽象出来,定义一个通用的类模板,而不关注具体的实现细节。:数据和代码捆绑在一起,避免外界干扰和不确定性访问。封装可以使得代码模块化。优点:确保用户代码不会无意间破坏封装对象的状态;被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。:让某种类型对象获得另一个类型对象的属性和方法,继承可以扩展已存在的代码。原创 2024-06-07 15:58:08 · 525 阅读 · 0 评论 -
C++进阶五:运算符重载
注意+运算符重载是返回一个新对象,而直接返回临时对象,对代码进行了优化=运算符重载就是返回自己本身对象,不过要先释放自己原先的内存(如果有动态开辟的话)原创 2024-06-07 15:57:47 · 131 阅读 · 0 评论 -
C++进阶六:继承和多态
一个类里面定义了虚函数,那么编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI指针(类类型信息指针)和虚函数的地址。当程序运行时,每一张虚函数表都会加载到内存的.rodata区。原创 2024-06-07 15:57:23 · 571 阅读 · 0 评论 -
C++进阶7:STL六大组件
有迭代器,没有find,只有泛型算法的find(因为有迭代器,所以可以使用),有insert、erase(因为有迭代器,所以可以使用),有back()、front()原创 2024-06-07 15:56:16 · 781 阅读 · 0 评论 -
C++进阶一:代码编译和运行时的调用堆栈
目录运行时进程的虚拟地址划分函数调用堆栈 程序编译链接原理每一个进程的用户空间是私有的,内核空间是共享的原创 2024-06-07 15:48:41 · 114 阅读 · 0 评论 -
C++11 - 右值引用
转载文章:链接原创 2024-06-02 16:57:17 · 288 阅读 · 0 评论 -
C++进阶二
带有形参默认值的函数是指在函数声明或定义中为一个或多个参数提供默认值,以便在调用函数时可以选择省略这些参数。当省略具有默认值的参数时,函数将使用预先定义的默认值来执行。需要注意:1 给默认值的时候,从右向左给2 定义出可以给形参默认值,声明也可以给形参默认值3 形参给默认值的时候,不管是定义处给,还是声明处给,形参默认值只能出现一次。原创 2024-06-02 16:53:28 · 1173 阅读 · 0 评论 -
80个GitHub上c/c++学习项目推荐——拎几个出来写进简历
①语言:c++②来源:GitHub 目前star:4.8k③项目地址:https://github.com/yuesong-feng/30dayMakeCppServer④类型:免费。原创 2024-06-01 11:17:59 · 2778 阅读 · 0 评论 -
C++:友元
友元(friend)是 C++ 中的一个关键字,用于建立类之间的友好关系;通过友元关系,一个类可以授权其他类或函数访问其私有成员或受保护成员,从而突破了 C++ 中的封装性;友元可以是类或函数,可以出现在类的声明中,也可以出现在类的外部,在声明中,友元关键字表明了某个函数或类是另一个类的友元,从而被授权访问该类的私有或受保护成员。友元关系为双向授权,即如果类 A 是类 B 的友元,但是类 B 不一定是类 A 的友元。原创 2024-06-01 10:27:09 · 299 阅读 · 0 评论 -
Windows 平台中静态链接库和动态链接库
在编写代码时引用这些静态连接库时,编译器会将所需的函数和数据从库中提取出来,并将它们直接嵌入到最终的可执行文件中。: 编写你的 DLL 的源代码,包括需要导出的函数、变量以及其他需要在 DLL 中使用的代码,通常需要源代码+头文件(调用DLL中的代码可以根据头文件进行)。在运行时,操作系统的动态链接器(如Windows中的DLL或Linux中的.so文件)会将库加载到内存中,并将其与目标程序共享。在编译目标程序时,链接器会在可执行文件中包含对动态链接库的引用,但不会将库的代码复制到可执行文件中。原创 2024-06-01 10:25:33 · 817 阅读 · 0 评论 -
C++: 异常
转载自公众号:风铃secC++ 异常处理机制是一种用于处理程序运行过程中出现异常情况的技术;异常是指程序在运行过程中发生的不正常情况,如除零错误、访问无效内存、文件不存在等。异常处理机制允许程序在发生异常时执行特定的操作,以便使程序更加健壮和可靠。原创 2024-06-01 10:20:59 · 278 阅读 · 0 评论 -
一文带你搞懂gdb调试C++以及调试多线程
当一个程序的多个线程获取多个互斥锁资源的时候,就有可能发生死锁问题,比如线程A先获取了锁1,线程B获取了锁2,进而线程A还需要获取锁2才能继续执行,但是由于锁2被线程B持有还没有释放,线程A为了等待锁2资源就阻塞了;例如需要在程序的第十八行增加一个断点,可以输入下面的命令。多线程问题往往不会出现在编译阶段,而是在运行阶段出现无法预计的错误,所以必须需要熟练使用gdb调试工具,找到出bug的位置,以及bug信息,并且改正,以下使用一个多线程中的出现的死锁问题并利用gdb调试工具进行调试解决bug。原创 2024-05-22 23:05:51 · 1317 阅读 · 0 评论 -
剖析并实现C++17新特性的Any类型
首先,Any类型接收一个任意类型的参数,也就是对其构造函数,模板化,同时拥有了一个成员指针,它是一个统一的指针,也就是接下来我会将它设计会基类的指针,以后会指向继承于它的派生类对象,注意我使用的是unique_ptr,所以手动声明了右值引用的拷贝和赋值,而删除了左值引用的拷贝和赋值(原因自查unique_ptr)也就是在下面,我继续实现了继承的关系方法。简要来说,我需要一个统一类型接收所有类型,并且统一类型可以推断接收的所有类型它到底是什么类型。2:Any拥有可以一个统一的类型指向任意类型,即联想到继承。原创 2024-05-24 12:42:48 · 501 阅读 · 0 评论 -
详解C++的this指针
this是一个指向当前对象的指针,它可以在类的成员函数中使用。它是每个类的非静态成员函数的隐含参数;当你在类的成员函数中使用this时,它指向调用该函数的对象。this指针的主要作用是让类的成员函数能够访问对象的成员变量和其他成员函数。因为每个对象都有自己的成员变量,所以需要一种方法来确定成员函数是在哪个对象上调用的,这就是this指针的作用。原创 2024-05-19 22:21:56 · 773 阅读 · 1 评论 -
C++设计模式:简单工厂、工厂方法、抽象工厂
简单工厂模式不能遵守开放-封闭原则,工厂和抽象工厂模式可以简单工厂模式只有一个工厂类,工厂和抽象工厂有多个工厂类工厂模式创建的产品对象相对简单,抽象工厂模式创建的产品对象相对复杂工厂模式创建的对象对应的类不需要提供抽象类【这产品类组件中没有可变因素】抽象工厂模式创建的对象对应的类有抽象的基类【这个产品类组件中有可变因素。原创 2024-05-10 19:21:07 · 972 阅读 · 1 评论 -
C++11中的右值引用、智能指针、function、bind、lambda、多线程
通过在构造函数中分配动态内存,并将字符串的副本存储在堆上,可以确保字符串的生存期与对象的生存期相匹配。同时,使用 和 确保了对内存的正确管理,避免了内存泄漏。究其原因是指针变量,不能浅拷贝,否则会出现当对象销毁时,指针指向的是一个无效的内存地址,这可能导致程序崩溃或者未定义的行为。或者出现内存重复释放的可能const左值引用 = 右值引用,所以为什么很多带左值引用的参数都加了const,右值不能带const,右值引用变量是左值,数组(指针,原因见上)都是通过new弄的,字符数组需要new len + 1原创 2024-05-10 18:15:33 · 1484 阅读 · 0 评论 -
C++的构造方法以及三条优化规则
函数参数传递过程中,对象优先按引用传递函数返回对象的时候,优先返回临时对象,而不是一个已经被定义过的对象接收返回值是对象的函数调用时,优先按初始化的方式接收,不要按赋值的方式也就是不要让已经定义过的对象接收。原创 2024-05-07 16:24:12 · 282 阅读 · 0 评论 -
数组指针、指针数组和二维数组
这种为数组指针,指向整个数组a的地址:p为数组地址, * p表示数组a本身,一般用数组的首元素地址来标识一个数组,当* p为数组首元素地址时,* * p表示首元素的值1,(*p)[1] 很好理解,就是2, 但不等于 * p[1]p:数组首地址,*p:第一个元素,p[2]:第三个元素, 不能 ( *p )[1],因为解引用就为int型了,是普通指针指向整型数据,好理解,比较类似于new出来的。*p:表示数组本身,由首位元素地址表示 **p:首元素。原创 2024-05-06 20:39:03 · 192 阅读 · 0 评论