结构体变量字节填充

Posted 创世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体变量字节填充相关的知识,希望对你有一定的参考价值。

二:

(1)sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。

(2)终于搞懂struct结构体内存分配问题了,结构体中各个成员字节对齐遵循以下几个原则: 直接用下面几个原则即可判断结构体的大小

1.结构体每个成员相对于结构体首地址的偏移量(offset)都是(这个)成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internaladding);

例如有以下一个结构体

structex {
int i;
char t;
int n;
}

第1个成员偏移量为0,是int型成员大小4(假设这太机器的整型长度占4个字节)的整数倍。

第2个成员t为char型,他的大小为1,首先假设在成员i和t之间没有填充字节,由于i是整型,占4个字节那么在没有填充之前,第2个成员t相对于结构体的偏移量为4,他是t成员大小1的4倍,符合此条件,所以系统在给结构体第2个成员分配内存时,不会在i和t之间填充字节以到达对齐的目的。

当分配结构体第3个成员n时,首先发现是一个整型数据,大小为4,没有填充之前,n相对于结构体首地址偏移量为:前面2个成员+填充字节=5,所以当系统发现5不是4(成员大小)的整数倍时,会在成员t之后(或者说n之前)填充3个字节,以使n的偏移量到达8而成为4的整数倍。这样这个结构体占用内存情况暂时为4+1+3+4。

2.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailingpadding)。

上面的结构体内存分配以后还要看是否满足此条件,假设在最末一个成员之后不需填充字节数,那么这个结构体的大小为12。而ex结构体中最宽基本类型成员为int,大小为4,12为4的整数倍,所以无须再在最末一个成员之后加上填充字节了。所以sizeof(ex)=12;

如果一个结构体如下所示

struc tex1{
int i;
char t;
int n;
char add;
}

那么sizeof(ex1)=16;原因就是在最后一个成员之后填充了3个字节。

3.还有一个额外的条件:结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

4.对于结构体成员属性中包含结构体变量的复合型结构体再确定最宽基本类型成员时,应当包括复合类型成员的子成员。但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。

5总结出一个公式:结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即:

sizeof( struct ) = offsetof( last item ) + sizeof( last item ) +sizeof( trailing padding )

以上是关于结构体变量字节填充的主要内容,如果未能解决你的问题,请参考以下文章

_packed / #pragma pack() 字节对齐问题

sizeof的计算

sizeof和strlen

Visual Studio2008 C++结构体成员需要内存对齐吗?

内存对齐:C/C++编程中的重要性和技巧

结构体偏移量(sizeof长度)的简单研究