
C++
文章平均质量分 87
C++学习笔记整理
玩转流媒体
这个作者很懒,什么都没留下…
展开
-
窥视C++细节-虚函数实现原理
文章目录环境类对象内有指向虚函数表的指针虚函数表创建时机及位置内容使用虚函数表指针调用虚函数为类对象初始化虚函数表指针虚函数调用过程动多态形成的实现机制环境在运行测试代码时,使用了如下环境:linux使用的是ubuntu 18,在ubuntu上使用的是g++,版本如下:root@learner:~# g++ --versiong++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0https://godbolt.org/,这个网站可以方便的将C++代码编译成汇编,同时使用原创 2021-03-16 20:09:00 · 414 阅读 · 1 评论 -
窥视C++细节-为什么成员初始化列表更快
文章目录环境必须使用成员初始化列表的情况成员变量是引用类型成员变量是const类型有参基类的构造器有参类类型数据成员构造器应注意的问题初始化列表快的原因定义一个用于测试的类不使用初始列表使用初始化列表总结环境在运行测试代码时,使用了如下环境:linux使用的是ubuntu 18,在ubuntu上使用的是g++,版本如下:root@learner:~# g++ --versiong++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0必须使用成员初始化列表的情况成员变量是原创 2021-03-16 20:08:42 · 1069 阅读 · 0 评论 -
窥视C++细节-STL使用萃取机提高性能
本文分析使用的SGI版的STL。其可读性非常高,提供一个下载链接:迭代器的种类STL中有五种迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机迭代器。struct input_iterator_tag {};struct output_iterator_tag {};struct forward_iterator_tag : public input_iterator_tag {};struct bidirectional_iterator_tag : public forward_i原创 2021-03-16 20:08:27 · 325 阅读 · 0 评论 -
窥视C++细节-编译器帮助合成默认构造器的情况
文章目录环境编译器并没有帮助合成默认构造器类内数据成员是类对象父类有默认构造器类内有虚函数有虚继承一般的C++书籍上会告诉你,当一个类没有声明任何构造函数时,编译器会自动的生成默认构造函数。但实际的情况好像不是这样的,当一个类没有声明任何构造函数,且在必要的时候编译器才会帮助合成默认构造器,在一些非必要的时候,编译是不会帮助合成默认构造器的。下面通过把C++编译成汇编的方式,分析哪四种常见情况下,编译器会帮助合成默认构造器。环境https://godbolt.org/,这个网站可以方便的将C++代码原创 2021-03-16 20:08:03 · 196 阅读 · 0 评论 -
窥视C++细节-使用移动构造和右值引用优化函数返回值
文章目录环境定义一个用于测试的类没有右值引用和移动构造ubuntu运行结果分析visual studio运行结果分析ubuntu中关闭返回值优化添加移动构造使用const引用接收返回值使用右值引用接收返回值总结本文不是介绍右值引用和移动语义的,在阅读本文前,假设读者已经知道了什么是右值引用和移动语义。右值分为:纯右值和将亡值,本文主要介绍纯右值,并不涉及将亡值。环境在运行测试代码时,使用了如下环境:linux使用的是ubuntu 18,在ubuntu上使用的是g++,版本如下:root@lear原创 2021-03-16 20:07:36 · 1389 阅读 · 2 评论 -
窥视C++细节-父类为什么要虚析构
文章目录环境单继承下的虚析构析构的顺序子类没有发生析构将父类析构器置为虚函数多继承下的虚析构this指针的调整多继承下的虚析构原理本文将分析,父类的析构函数为什么必须为虚函数,如果不是虚函数会造成什么问题?在没有使用多态时,是否还需要将父类的析构器置为虚函数?同时也会分析多继承下的虚析构问题。环境https://godbolt.org/,这个网站可以方便的将C++代码编译成汇编,同时使用颜色标识某条C++语句对应的汇编代码。在使用之前需要可以根据自己的习惯配置一下。使用的gcc版本是10.2-原创 2021-03-16 20:07:04 · 1603 阅读 · 0 评论 -
窥视C++细节-类成员函数的隐式参数this
文章目录环境栈帧-示例类成员函数的调用类成员函数的汇编代码环境https://godbolt.org/,这个网站可以方便的将C++代码编译成汇编,同时使用颜色标识某条C++语句对应的汇编代码。在使用之前需要可以根据自己的习惯配置一下。使用的gcc版本是10.2-m32:将C++代码编译成32位的汇编-O0:不要进行编译优化Intel asm syntax:编译成intel格式的汇编,默认是AT&T格式的汇编。Demangle identifiers:反命名倾轧,在汇编代码中使用C+原创 2021-03-16 20:06:31 · 977 阅读 · 0 评论 -
窥视C++细节-为资源管理类提供swap函数的原因
文章目录环境定义一个用于测试的类使用std::swap函数类内有移动构造和移动赋值运算符类内没有移动构造和移动赋值运算符提供自己的swap函数总结在有资源的类中,使用swap函数交换两个对象时,如果没有正确的使用swap函数,则会造成资源的拷贝和释放,导致性能降低。环境在运行测试代码时,使用了如下环境:linux使用的是ubuntu 18,在ubuntu上使用的g++版本如下:root@learner:~# g++ --versiong++ (Ubuntu 7.5.0-3ubuntu1~18.0原创 2021-03-16 20:05:56 · 342 阅读 · 0 评论 -
窥视C++细节-使用tie函数解包pair对象的原理
文章目录示例std::tie函数std::ignorestd::pair和std::tuple互转解包pair返回值示例这是http://www.cplusplus.com/reference/tuple/tie/?kw=tie中的一个std::tie()函数的示例。#include <iostream> // std::cout#include <tuple> // std::tuple, std::make_tuple, std::tieint原创 2021-03-16 20:05:33 · 1756 阅读 · 1 评论 -
浅析vector容器(3)-使用移动语义提高性能
文章目录定义一个用于测试的类没有移动构造时构造vector对象向vector中推入对象a提供移动构造时构造vector对象向vector中推入对象a移动构造必须加上noexcept在上一篇文章中,我们可知,在vector进行扩容或缩容的时候,元素的拷贝是不可避免的。既然拷贝是不可避免的,那么能不能较低拷贝的开销哪?C++11中很大的一个特性是移动语义,移动语义可以将资源“偷”过来,避免了资源的拷贝和释放。在类有很大的资源时,使用移动语义可以大幅的提升类构造和赋值的性能。接下来分析一下,移动语义是如何提原创 2021-03-16 20:04:36 · 3546 阅读 · 0 评论 -
浅析vector容器(2)-减少vector内存占用
vector之所以会发生大量的拷贝,是因为其内存分配策略造成的。每当vector的内存不够用时,vector都会重新申请两倍的空间,并将之前的元素搬移到新空间。这才是发生拷贝的根源,既然这样,我们能不能预先给vector申请一定的空间,避免因空间不够而发生元素搬移。使用reverse()函数预申请空间reverse()函数可以给vector预先分配指定大小的空间。vector<A> va;va.reserve(1024);cout<<"va size = "&l原创 2020-07-05 22:38:37 · 2103 阅读 · 1 评论 -
浅析vector容器(1)-vector内存分配策略
vector是一个封装了动态大小数组的顺序容器,它能够存放各种类型的对象。 可以删除元素、可以插入元素、可以查找元素,做这些工作我们无需管理容器内存。容器内存管理,这种脏活累活全部交由vector管理。了解一下vector的内存管理策略,能够更加充分的利用内存。1、定义一个用于测试的类class A{public: A(int data = 100) :data_(data) { construct_count_++; cout<原创 2020-07-05 22:24:12 · 3795 阅读 · 2 评论