C++中的结构体与sizeof
前几天在C/C++版上看到一个关于“对齐”和“sizeof”的问题。原来一直以为自己已经把这个问题弄清楚了,但是看了帖子之后才发现仍有许多概念模糊的地方,于是把MSDN翻出来细细看了一下,又做了几个小试验验证自己的想法,并作此文,作为自己对这个问题的一个阶段性小结。文中若有不对之处,望各位大侠批评指正。
影响结构体的sizeof的因素:
1) 不同的系统(如32位或16位系统):不同的系统下int等类型的长度是变化 的,如对于16位系统,int的长度(字节)为2,而在32位系统下,int的长度为4;因此如果结构体中有int等类型的成员,在不同的系统中得到的sizeof值是不相同的。
2) 编译器设置中的对齐方式:对齐方式的作用常常会让我们对结构体的sizeof值感到惊讶。
对齐
为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统):
Type |
Alignment |
char |
在字节边界上对齐 |
short (16-bit) |
在双字节边界上对齐 |
int and long (32-bit) |
在4字节边界上对齐 |
float |
在4字节边界上对齐 |
double |
在8字节边界上对齐 |
structures |
单独考虑结构体的个成员,它们在不同的字节边界上对齐。 其中最大的字节边界数就是该结构的字节边界数。 |
|
MSDN原话:Largest alignment requirement of any member |