C++中的结构体与sizeof

发表于:2007-07-01来源:作者:点击数: 标签:
C++ 中的结构体与 sizeof 前几天在C/C++版上看到一个关于“对齐”和“sizeof”的问题。原来一直以为自己已经把这个问题弄清楚了,但是看了帖子之后才发现仍有许多概念模糊的地方,于是把MSDN翻出来细细看了一下,又做了几个小试验验证自己的想法,并作此文,

  

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

原文转自:http://www.ltesting.net