结构体的内存对齐(重点)

什么是结构体的内存对齐

结构体的内存对齐是指在计算机编程中,编译器按照一定的规则对结构体中的数据成员在内存中的存放位置进行调整,以确保数据成员的地址满足特定的对齐要求。这种对齐不是指数据类型本身的大小,而是指数据在内存中的位置对齐到某个边界,通常是数据大小的倍数。
内存对齐的目的是为了提高内存访问的效率。许多处理器在访问非对齐的数据时会有性能损失,甚至可能不支持非对齐访问。因此,为了确保数据能够被高效地访问,编译器会按照以下原则对数据进行对齐:

1. **数据成员对齐**:

每个数据成员都会根据其类型的大小和对齐要求进行对齐。例如,如果一个int类型的大小是4字节,那么这个int变量就会放置在4字节的边界上。


2. **结构体整体对齐**:

整个结构体也会根据其最大成员的对齐要求进行对齐。这意味着结构体的尺寸可能是其所有成员大小之和加上一些填充字节(padding),以满足最大成员的对齐要求。


3. **填充字节**:

为了满足对齐要求,编译器可能会在结构体中的数据成员之间或结构体末尾添加不必要的空字节。这些填充字节不会存储任何有用的数据,但它们的存在确保了结构体和其成员都能被正确对齐。


4. **对齐边界**:

对齐边界通常是数据大小的倍数,例如,1字节、2字节、4字节、8字节等。不同的平台和编译器可能有自己的对齐规则。


结构体的内存对齐是一个重要的概念,特别是在涉及到内存效率和性能敏感的应用中,如图形处理、网络编程和对性能要求极高的系统编程等领域。正确地理解和使用结构体内存对齐可以显著提高程序的性能。

———————————————————————————————————————————

结构体对齐的原则

1、第一个成员在与结构体偏移量为0的地址处;

2、其他成员变量要与自身类型的整数倍地址处对齐;

3、结构体总大小为要与 “处理器字节数与成员类型所占字节数最大的最小值” 的整数倍对齐;

4、如果出现嵌套情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

5、#pragma pack(n) 可以用来控制默认对齐数的大小

什么意思呢,下面我们会进行语言的解释

———————————————————————————————————————————

结构体内存对齐的详细图解 

%zd------->打印无符号整形

———————————————————————————————————————————

结构体内存对齐-举例1

首先我们创建一个结构体

我们要计算他的字节大小,如果只是看起来,那就是无非是1字节,4字节,1字节,但是实际放到编译器里面, 计算子字节大小的时候并不是6字节大小,而是12字节大小

这里我们进行图片的解释

六个字节浪费了 1

步骤详解 

———————————————————————————————————————————

结构体内存对齐-举例2

———————————————————————————————————————————

结构体内存对齐-举例3

对齐自己结构体最大成员字节个数


——————————————————————————————————————————— 

为什么存在内存对齐

主要是平台原因和性能原因

虽然浪费空间 但是提升时间

如果是倍数的情况下 只读取一次就解决 但是不对齐两次才能获取


减少浪费空间

占用空间小的放在一起

就会最大限度的节约空间

———————————————————————————————————————————

修改默认对齐数

这里这一段中间的结构体的默认对齐数也就变成1 也就是连续的放置

默认对齐的数一般都是2的次方数

Linux没有对齐数

那也就是变成了自身的大小

———————————————————————————————————————————

结构体对齐的原则总结

1、第一个成员在与结构体偏移量为0的地址处;

2、其他成员变量要与自身类型的整数倍地址处对齐;

3、结构体总大小为要与 “处理器字节数与成员类型所占字节数最大的最小值” 的整数倍对齐;

4、如果出现嵌套情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

5、#pragma pack(n) 可以用来控制默认对齐数的大小

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值