您的位置:首页 > 编程语言 > C语言/C++

<C/C++>C语言字节对齐问题总结

2014-05-20 20:12 846 查看
现在打算把自己的掌握的一些东西以博客的形式展现出来,一、作为自己的笔记,防止以后忘记有个博客可以方便自己查询,二、分享出来,如果写的正确可以给还不懂的人一些帮助,如果写错了,别人帮忙指出来,对自己也是一种提高。今天这篇博客打算写一下关于C语言字节对齐的问题。

struct node1{
char a;
int b;
char c;
int d;
};

struct node2{
char a;
char c;
int b;
int d;
};


对于32bit编译器,sizeof(node1)和sizeof(node2)的大小相等吗,大小是多少,如果不等,大小分别又是多少?这就是今天我要讲的字节对齐问题,如果你掌握了上面的问题你将很容易答上来。

对齐值:
对于每一个基础类型(如:char、int、short、long、double)他们都有一个字节大小(如char占一个字节等),他们还相对应的存在一个对齐值。但是要明白类型所占的字节数和对齐值不是一样大的。对齐值是可以通过#pragma
pack (2) /*指定按2字节对齐*/制定,可以通过#pragma pack ()取消。

对于32bit编译器:

类型charshortintlongdouble
所占字节12448
(缺省)对齐值(byte)12444
对于struct的对齐值,等于在其包含的类型中取最大的对齐值,如上面的struct node1的对齐值=4,应该其所包含的类型中对齐值最大的为int,int的对齐值=4。

我们先运行一段程序,根据程序结果来讲解对齐值的概念:
程序如下:
struct node1{
char a;
int b;
char c;
int d;
};

struct node2{
char a;
char c;
int b;
int d;
};

int main()
{
printf("%d,%d\n",sizeof(node1),sizeof(node2));
return 0;
}


用32bit编译器,运行结果如下:



为什么node1的结果是16,而node2的结果是12?下面我们来分析一下,
1)首先我们先判断node1和node2的对齐值分别是多少,这个答案应该很明显,它们都是4;

2)对于node1而言,先存储1个byte的a,由于对齐值是4,所以后面还有3个byte空余,接下来存储4个byte的b,因此存放不下,所以从下一个4byte开始,之前的3个byte只能空闲,以此类推,最后node1占16个byte。
3)对于node2而言,先存储1个byte的a, 由于对齐值是4,所以后面还有3个byte空余,接下来存储1个byte的c,能够存放下,还剩2个空闲的byte,接下来存放4个byte的b,存放不下,从下一个4byte开始,以此类推,最后node2占12个byte。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: