您的位置:首页 > 其它

关于字节对齐的一些理解

2014-11-04 00:16 232 查看
1、基本数据对齐

在X86,32位系统下基于Microsoft、Borland和GNU的编译器,有如下数据对齐规则:

a、一个char(占用1-byte)变量以1-byte对齐。

b、一个short(占用2-byte)变量以2-byte对齐。

c、一个int(占用4-byte)变量以4-byte对齐。

d、一个long(占用4-byte)变量以4-byte对齐。

e、一个float(占用4-byte)变量以4-byte对齐。

f、一个double(占用8-byte)变量以8-byte对齐。

g、一个long double(占用12-byte)变量以4-byte对齐。

h、任何pointer(占用4-byte)变量以4-byte对齐。

而在64位系统下,与上面规则对比有如下不同:

a、一个long(占用8-byte)变量以8-byte对齐。

b、一个double(占用8-byte)变量以8-byte对齐。

c、一个long double(占用16-byte)变量以16-byte对齐。

d、任何pointer(占用8-byte)变量以8-byte对齐。

2、结构体数据对齐

结构体数据对齐,是指结构体内的各个数据对齐。在结构体中的第一个成员的首地址等于整个结构体的变量的首地址,而后的成员的地址随着它声明的顺序和实际占用的字节数递增。为了总的结构体大小对齐,会在结构体中插入一些没有实际意思的字符来填充(padding)结构体。

在结构体中,成员数据对齐满足以下规则:

a、结构体中的第一个成员的首地址也即是结构体变量的首地址。

b、结构体中的每一个成员的首地址相对于结构体的首地址的偏移量(offset)是该成员数据类型大小的整数倍。

c、结构体的总大小是对齐模数(对齐模数等于#pragma pack(n)所指定的n与结构体中最大数据类型的成员大小的最小值)的整数倍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: