关于C语言的字节对齐

小生一直认为结构体的大小就是将结构体成员的大小总和。
在一次面试的时候,面试官问我:“如何求结构体的大小”,我很自信地说:“将结构体成员全部加起来”。现在回想起来,当时是多么的无知。

一、概念
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。需要字节对齐的根本原因在于CPU访问数据的效率问题。

二、示例
以下是小生在64位Windows7的操作系统32位的编译器环境下得出的

关键字 大小
char 1
short 2
int 4
float 4
long 4
double 8
long long int 8

int小于等于数据线宽度,size_t大于等于地址线宽度。
使用QT编译器获得的结果:
这里写图片描述


现在开始正题

struct
{
    char a;
    int b;
}abc:

面试官问:“sizeof(abc)是多少?”,根据上面的表格,char是1个字节,int是4个字节,C语言基础不好的人会说是5个字节,当时小生也是这么说的。现在我们看看编译器给出的结果。
sizeof(abc)的结果
很神奇,为什么多了3个字节?


struct
{
    char a;
    char b;
    int c;
}abc;

这个会是多少呢?
这里写图片描述
还是一样,现在开始解释这是为什么。


第一个struct在内存中存放的格式如下图
这里写图片描述
第二个struct在内存中存放的格式如下图
这里写图片描述
由此可知,字节对齐就是在存储区未满的情况下将其后面补全,始终为编译器位数的倍数。

总结

struct会以最长的数据类型来对齐,就是说struct{long long int, char}是16个字节,struct{int, char}是8字节,struct{long long int, int}是16字节。struct{struct{int, char}, long long int}是24字节,也就是说无论嵌套多少次,都要以最长的数据类型来对齐。并且要偶数对齐,struct{char, short, char, int}是12字节。
结构体嵌套也是如此。

大家可以看一下,http://blog.csdn.net/21aspnet/article/details/6729724/
这里讲得很清楚。本文章用于小生做笔记。

猜你喜欢

转载自blog.csdn.net/freiheit_zz/article/details/78853559
今日推荐