【博客39】类的默认成员函数是按需生成的!

内容: 复习了之前看过的深度探索c++对象模型,然后其中提到的类的构造函数,拷贝构造函数,析构函数,复制构造函数等必要的成员函数,如果你没有自己定义,那么编译器会默认帮你生成。不过这仅限于:有必要生成的情况。 也就是说,如果有必要生成就为你生成,如果没必要生成的,编译器可以直接优化掉,从而避免函数调用的开销。

看完深度探索c++对象模型后,大吃一惊,于是赶紧跟师兄请教了这个问题,得到师兄的肯定后,我也就没去亲手测试一下,今天测试一下。

测试代码一:不生成默认的构造和拷贝构造的情况
在这里插入图片描述
汇编结果:
在这里插入图片描述
结果分析:由于你的对象类型属于那种可以直接 “按位复制” 的情况,那么编译器有办法直接帮你优化,可以看到编译器并没有调用构造和拷贝构造,而是直接进行了成员的复制,从而避免函数调用的过程,可以知道如果是按位复制的情况,那么不会帮你生成默认的构造,拷贝构造,因为可以被优化,至于按位复制的情况我写完下个例子就来说明哈。

测试代码二:生成默认的构造和拷贝构造的情况(对比图1加了个虚函数)
在这里插入图片描述
结果:
在这里插入图片描述
汇编分析:可以看到默认帮你生成了构造函数和拷贝构造函数,而且调用了它们。那么什么情况生成,什么情况不生成呢?

总结: 当出现以下情况时,帮你生成默认的几个成员函数
1.类声明了一个或者多个虚函数
原因:此时构造函数需要完成一些多态机制的工作,比如设置虚函数表指针
2.类派生自一个继承串链时,且继承结构中有虚基类
原因:不仅需要设置虚函数表指针,还有虚基类表指针,然后继承结构中最后的子类还要负责去构造虚基类,然后vs下测试结果会有虚函数表指针,虚基类表指针,linux gcc下应该是合二为一了,测试出来只有一个指针,查资料结果是合在一起,统一成一张虚表了。(后面有空补上一篇测试)
3.当类含有一个类成员,但是这个类有生成自己的构造函数,拷贝构造函数之类的几个默认生成的函数,此时要生成默认的这几个函数。
4.当类的基类生成自己的构造函数,拷贝构造函数之类的几个默认生成的函数,此时要生成默认的这几个函数。
5.同时默认生成的函数是 “按需生成”

五一放假回家没带电脑,就带了书回去复习,停了几天,今天就再补一篇关于TCP三次握手初始序列号吧。有兴趣的转到主页见【博客40】,同时欢迎对其他文章提出你的看法哈。

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/89843080