字节对齐小谈

一时兴起,忽然想到数组与结构到底是什么关系呢?原本结构和数组没什么联系。FORTRAN就出现了数组的概念,结构是在Algol中出现的,C++开始结构成为定义新的数据类型的主要方式。结构在编程语言中的地位是为了让用户可以定义集成在一起的一些量,给这个整体一个名字;而数组是为了表达能表达一连串相同类型的数据的。(翁恺)

总结了一下数组与结构的联系与区别为以下几点:

区别:

1、结构的内部成员类型可以不一样,而数组是一组类型相同的数据的集合;

2、访问成员的方式不一样,数组用[]运算符,结构用.运算符;

3、运算方式中也有区别,结构可以直接赋值,而数组不行;

4、指针方式不同:结构变量的名字并不是结构变量的地址,必须使用&运算符;

5、作为函数参数传入函数,处理方式不同。

联系:

1、都可以当全局变量和局部变量;

2、结构和数组都是一个容器,它们的出现都是为了编程更简单,更形象化,满足不同需求。

既然谈到结构,那就必须提到字节对齐,为了能够更明白的说清楚字节对齐这个概念,通过仿真实现形象说明,读者可以自行仿真验证。

(1)按1字节对齐

(2)按2字节对齐

(3)按4字节对齐

(4)按8字节对齐

(5)改变结构成员变量类型进行验证

(6)​再验证说明

解释说明:

编译器中可以设定,本例结构体有char(1个字节)、short(2个字节)、int(4个字节)、double(8个字节):

1、#pagma pack(1)表示按照1字节对齐,则结构体中成员之间是连续的,相邻成员地址的差等于相邻成员的sizeof,自然而然,结构体的sizeof正好等于全部成员的sizeof之和。

2、#pagma pack(2)、#pagma pack(4)、#pagma pack(8)分别表示按照2字节、4字节、8字节对齐,则结构体中成员之间是不连续的,相邻成员地址的差也不等于相邻成员的sizeof,自然而然,结构体的sizeof也不等于全部成员的sizeof之和。对于2个字节对齐,char需要再补1个字节,组成2个字节;而是2个字节的整数倍的类型则没有关系;对于4个字节对齐,char补足两个字节,再与short组成4个字节;对于8个字节对齐,char补足两个字节,再与short组成4个字节,再与int组成8个字节。所以三种结果正好是一致的。

3、验证(1):将int型改为short型,将double型改为int型,用4字节对齐方式,char补足两个字节,再与第一个short组成4个字节;第二个short需要补2个字节,组成4个字节;所以结构体最后结果是12个字节。

4、验证(2):结构体中改为char、int、int、double。最后结果为24个字节。验证正确,根据结果想想为什么?想明白了说明你理解了。共勉!

版权所有,转载请注明来源

程序猿博客:​http://blog.sina.com.cn/u/2480166565

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务