博客
关于我
C结构体内存对齐细节
阅读量:226 次
发布时间:2019-03-01

本文共 1332 字,大约阅读时间需要 4 分钟。

内存对齐是C语言编译器在处理结构体内存布局时所必须遵循的重要规则。它的核心目标是确保结构体成员的起始地址能够满足特定偏移条件,从而避免内存碎片以及提升程序运行效率。以下是内存对齐的三个主要原则:

1. 结构体成员的首地址必须是其最宽基本类型成员大小的整数倍

这意味着结构体中最宽的数据类型(例如uint64_t)所占的字节数,必须能够整除结构体中所有成员的首地址。例如,在以下结构体中:

struct st{    uint16_t id;  // 2 字节    uint32_t value; // 4 字节    uint64_t time; // 8 字节};

uint64_t占用8字节,因此结构体的每个成员起始地址都必须是8的倍数。这样可以确保所有成员的存储位置对齐,避免内存碎片。

2. 成员之间的偏移量必须是基本类型大小的整数倍

编译器会根据结构体成员的大小,计算每个成员相对于结构体首地址的偏移量。例如,在以下结构体中:

struct Date{    char a;  // 1 字节    int b;  // 4 字节    int64_t c;  // 8 字节    char d;  // 1 字节};

int64_t占用8字节,char占用1字节。因此,int b的偏移量是4字节,int64_t c的偏移量是8字节,char d的偏移量是12字节。编译器会在成员之间添加适当的填充字节,以确保所有成员的起始地址都满足对齐要求。

3. 结构体总大小必须是最宽基本类型成员大小的整数倍

结构体的总大小是所有成员大小的总和加上填充字节的数量。同样地,最宽基本类型成员的大小决定了整个结构体的对齐方式。例如,在以下示例中:

struct Date{    char a;  // 1 字节    int b;  // 4 字节    int64_t c;  // 8 字节    char d;  // 1 字节};Data data[2][10];

int64_t占用8字节,因此每个Data结构体的大小必须是8的倍数。编译器会在最后一个成员之后添加填充字节,以确保整个结构体的对齐。

示例分析

考虑以下结构体:

struct Date{    char a;  // 1 字节    int b;  // 4 字节    int64_t c;  // 8 字节    char d;  // 1 字节};

编译器会将int64_t c的偏移量定为8字节,并在char d之前添加填充字节,以确保其起始地址是8的倍数。这样,char d的起始地址为12字节,满足对齐要求。

内存占用示例

Data data[2][10];中,每个Data结构体的大小为16字节(8字节的int64_t c加上填充字节)。因此,data[1][5].c的地址为:

data[1][5].c = data + 1*16 + 5*8 = data + 1*16 + 5*8 = data + 48 = data + 368

这与data[1][5].c的实际存储位置一致。

通过遵循上述对齐规则,编译器能够有效地管理结构体内存布局,确保程序的稳定性和性能。

转载地址:http://zrzt.baihongyu.com/

你可能感兴趣的文章
Objective-C实现图-弗洛伊德FloydWarshall算法(附完整源码)
查看>>
Objective-C实现图书借阅系统(附完整源码)
查看>>
Objective-C实现图像二维熵的图像信号丢失检测(附完整源码)
查看>>
Objective-C实现图像去雾算法(附完整源码)
查看>>
Objective-C实现图像灰度变换(附完整源码)
查看>>
Objective-C实现图像相似度平均值哈希算法(附完整源码)
查看>>
Objective-C实现图像移动(附完整源码)
查看>>
Objective-C实现图层混合算法(附完整源码)
查看>>
Objective-C实现图片dilation operation扩张操作算法(附完整源码)
查看>>
Objective-C实现图片erosion operation侵蚀操作算法(附完整源码)
查看>>
Objective-C实现图片的放大缩小(附完整源码)
查看>>
Objective-C实现图片腐蚀(附完整源码)
查看>>
Objective-C实现图片膨胀(附完整源码)
查看>>
Objective-C实现图的邻接矩阵(附完整源码)
查看>>
Objective-C实现圆球的表面积和体积(附完整源码)
查看>>
Objective-C实现在Regex的帮助下检查字谜算法(附完整源码)
查看>>
Objective-C实现在指定区间 [a, b] 中找到函数的实根,其中 f(a)*f(b) < 0算法(附完整源码)
查看>>
Objective-C实现均值滤波(附完整源码)
查看>>
Objective-C实现埃拉托斯特尼筛法算法(附完整源码)
查看>>
Objective-C实现域名解析(附完整源码)
查看>>