![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深度探索C++对象模型
qq_37429869
这个作者很懒,什么都没留下…
展开
-
程序转化语义
我们写的代码,编译器会对代码进行拆分,拆分成编译器更容易理解和实现的代码。看一看编译器是如何解析这些代码的。站在程序员角度/站在编译器角度 ,程序员看代码视角 和 编译器看代码视角之间不断切换。(1)定义时初始化对象#include <iostream>#include <time.h >using namespace std;class X{public: int m_i; X(const X &tmpx) { m_i = tmpx.m.原创 2020-10-26 22:25:18 · 712 阅读 · 0 评论 -
拷贝构造函数语义
传统上,大家认为:如果我们没有定义一个自己的拷贝构造函数,编译器会帮助我们合成 一个拷贝构造函数。这个合成的拷贝构造函数,也是在 必要的时候才会被编译器合成出来。A mya1;mya1.m_test = 15;mya1.asubobj.m_testson = 120;A mya2 = mya1; 这个mya2.m_test = 15,这个其实是编译器内部的一个手法:成员变量初始化手法,比如int这种简单类型,直接就按值就拷贝过去,编译器不需要合成拷贝构造函数的情况下就帮助我们把这个事情办了原创 2020-10-26 22:15:04 · 143 阅读 · 0 评论 -
分析obj目标文件,构造函数语义
传统认知认为:如果我们自己没定义任何构造函数,那么编译器就会为我们隐式自动定义 一个默认的构造函数,我们称这种构造函数为:“合成的默认构造函数”介绍在windows下怎么看obj文件。 打开VS的本机工具命令提示符,用dumpbin命令把.obj文件内容导出成可查看文件my.txt,这个my.txt格式,一般被认为是COFF:通用对象文件格式(Common Object File Format); 编译器会在哪些必要的时候帮助我们把默认的构造函数合成出来呢?...原创 2020-10-26 22:01:38 · 181 阅读 · 0 评论 -
this指针调整
派生类对象 它是包含 基类子对象的。(1)如果派生类只从一个基类继承的话,那么这个派生类对象的地址和基类子对象的地址相同。(2)但如果派生类对象同时继承多个基类,那么大家就要注意:第一个基类子对象的开始地址和派生类对象的开始地址相同。后续这些基类子对象的开始地址 和派生类对象的开始地址相差多少呢?那就得把前边那些基类子对象所占用的内存空间干掉。总结:你调用哪个子类的成员函数,这个this指针就会被编译器自动调整到对象内存布局中对应该子类对象的起始地址那去;#define _CRT.原创 2020-10-19 23:28:46 · 129 阅读 · 0 评论 -
类对象的组成结构图
类对象大小的计算:(1)静态数据成员不计算在类对象sizeof()内;(2)普通成员函数和静态成员函数不计算在类对象的sizeof()内(3)虚函数不计算在类对象的sizeof()内,但是虚函数会让类对象的sizeof()增加4个字节以容纳虚函数表指针。(4)虚函数表[vtbl]是基于类的(跟着类走的,跟对象没关系,不是基于对象的);(5)如果有多个数据成员,那么为了提高访问速度,某些编译器可能会将数据成员之间的内存占用比例进行调整。(内存字节对齐)(6)不管什么类型指针char *原创 2020-10-19 23:13:57 · 539 阅读 · 0 评论 -
类对象所占用的空间
类对象所占用的空间(1)成员函数虽然也写在类的定义中,成员函数不占用类对象的内存空间;(2)一个类对象至少占用1个字节的内存空间,空类的大小为1字节;(3)成员变量是占用对象的内存空间;...原创 2020-10-19 23:01:20 · 315 阅读 · 0 评论