好贷网好贷款

内存对齐(计算结构体大小)方法

发布时间:2016-12-3 2:06:42 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"内存对齐(计算结构体大小)方法",主要涉及到内存对齐(计算结构体大小)方法方面的内容,对于内存对齐(计算结构体大小)方法感兴趣的同学可以参考一下。

struct stu1 { int i; char c; int j; }; 结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。 第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4+1),其值为5。 由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则: 一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)  二、结构体大小必须是所有成员大小的整数倍。 对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。 对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。 struct stu2 { int k; short t; }; 成员k的偏移量为0;成员t的偏移量为4,都不需要调整。但计算出来的大小为6,显然不是成员k大小的整数倍。因此,编译器会在成员t后面补上2个字节,使得结构体的大小变成8从而满足第二个要求。 由此可见,大家在定义结构体类型时需要考虑到字节对齐的情况,不同的顺序会影响到结构体的大小。对比下面两种定义顺序 struct stu3          {                 char c1;                 int i;                char c2;          } struct stu4          {                char c1;                char c2;                int i;          } 虽然结构体stu3和stu4中成员都一样,但sizeof(struct stu3)的值为12而sizeof(struct stu4)的值为8。-----》所以,在定义结构体时,一般从小到大定义变量。 如果结构体中的成员又是另外一种结构体类型时应该怎么计算呢?只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。看下面的例子: struct stu5 { short i; struct { char c; int j; } ss; int k; } 结构体stu5的成员ss.c的偏移量应该是4,而不是2。整个结构体大小应该是16。

上一篇:centos 6.5搭建hadoop2.2.0
下一篇:Ubuntu下root帐号使用Chrome

相关文章

相关评论