逆向工程初探之结构体和类(内存布局)

本文探讨C++中的内存布局,包括空类的实际长度为1字节以及内存对齐的规则。内容涉及空类的特殊性质,结构体和类的内存分配,以及如何通过`#pragma pack(n)`调整对齐大小。通过对各种情况的分析,揭示了内存布局和对齐策略对结构体和类大小的影响。
摘要由CSDN通过智能技术生成


在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值