在c++中,结构体和类都具有构造函数、析构函数和成员函数,两者只有一个区别:
结构体的默认访问控制默认为public,而类的访问控制是private。
对于C++中的结构体而言,public、private、protected的访问控制是在编译期进行检查,当越权访问时,编译过程中会检查此类错误并给与提示。编译成功后,程序在执行过程中不会对访问控制做任何检查和限制。因此,在反汇编中,c++和结构体与类没有分别,两者的原理相同,只是类型名称不同。
内存布局
对象中先定义的数据成员在低地址处,后定义的数据成员在高地址处,依次排列。对象的大小只包含数据成员,类成员函数属于执行代码,不属于类对象的数据。
类的内部不能定义自身的对象,因为在申请内存的时候要计算出自己的实际长度,而如果定义了自身的对象,就形成了递归定义,而这个递归并没有出口,是一个无限的循环递归定义。
32位下任何类型指针占4字节
64位下任何类型指针占8字节
计算结构体和类的长度时不能单纯的按每个数据类型的长度相加计算
还要考虑对齐方式和空类的问题,所以单纯相加不对。
空类 :
空类中没有任何数据成员,单纯相加算出来空类的长度为0,实际情况是,空类的长度为1字节,这1字节用于类的实例化,这1字节的数据并没有被使用。
内存对齐:
默认的对齐长度为8
在为结构体和类中数据成员分配内存时,结构体中的当前数据成员的类型长度为M,指定的对齐值为N,那么实际对齐值为q=min(M,N),其地址安排在q的倍数上。
如下结构体
struct st
{
short a;
int b;
};
int main