深入理解计算机系统笔记_程序的机器级表示_3.9异质的数据结构

C语言提供了两种将不同类型的对象组合到一起创建数据类型的机制:结构(structure),用关键字 struct来声明,将多个对象集合到一个单位中;联合(union),用关键字 union来声明,允许用几种不同的类型来引用一个对象
3.9.1结构
C语言的 struct声明创建一个数据类型,将可能不同类型的对象聚合到一个对象中。
用名字来引用结构的各个组成部分。类似于数组的实现,结构的所有组成部分都存放在内存中一段连续的区域内,而指向结构的指针就是结构第一个字节的地址。编译器维护关于每个结构类型的信息,指示每个字段(field)的字节偏移。它以这些偏移作为内存引用指令中的位移,从而产生对结构元素的引用。
C语言提供的 struct数据类型的构造函数(constructor)与C++和Java的对象最为接近。
它允许程序员在一个数据结构中保存关于某个实体的信息,并用名字来引用这些信息。
例如,下面的函数计算长方形的面积,这里,传递给函数的就是一个指向长方形struct的指针
在这里插入图片描述
表达式(rp).width间接引用了这个指针,并且选取所得结构的 width字段。这里必须要用括号,因为编译器会将表达式rp.widh解释为*(rp.width),而这是非法的。间接引用和字段选取结合起来使用非常常见,以至于C语言提供了一种替代的表示法->。即rp->widh等价于表达式(*rp).Widh。
在这里插入图片描述
为了访问结构的字段,编译器产生的代码要将结构的地址加上适当的偏移。
结构的各个字段的选取完全是在编译时处理的。机器代码不包含关于字段声明或字段名字的信息
3.9.2联合
联合提供了一种方式,能够规避C语言的类型系统,允许以多种类型来引用一个对象。联合声明的语法与结构的语法一样,只不过语义相差比较大。它们是用不同的字段来引用相同的内存块。
在这里插入图片描述
在这里插入图片描述
在一些下上文中,联合十分有用。但是,它也能引起一些讨厌的错误,因为它们绕过了C语言类型系统提供的安全措施。一种应用情况是,我们事先知道对一个数据结构中的两个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分,而不是结构的一部分,会减小分配空间的总量。
联合还可以用来访问不同数据类型的位模式
当用联合来将各种不同大小的数据类型结合到一起时,字节顺序问题就变得很重要了
3.9.3数据对齐
许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2、4或8)的倍数。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。
无论数据是否对齐,x86-64硬件都能正确工作。不过,Intel还是建议要对齐数据以提高内存系统的性能。对齐原则是任何K字节的基本对象的地址必须是K的倍数。可以看到这条原则会得到如下对齐:
在这里插入图片描述
对于包含结构的代码,编译器可能需要在字段的分配中插入间隙,以保证每个结构元素都满足它的对齐要求。而结构本身对它的起始地址也有一些对齐要求。在这里插入图片描述
对于大多数ⅹ86-64指令来说,保持数据对齐能够提高效率,但是它不会影响程序的行为。另一方面,如果数据没有对齐,某些型号的 Intel和AMD处理器对于有些实现多媒体操作的SSE指令,就无法正确执行。这些指令对16字节数据块进行操作,在SE单元和内存之间传送数据的指令要求内存地址必须是16的倍数。任何试图以不满足对齐要求的地址来访问内存都会导致异常(参见8.1节),默认的行为是程序终止。

因此,任何针对κ86-64处理器的编译器和运行时系统都必须保证分配用来保存可能会被SSE寄存器读或写的数据结构的内存,都必须满足16字节对齐。这个要求有两个后果任何内存分配函数(a11oca、ma1loc、ca11oc或rea11oc)生成的块的起始地址都必须是16的倍数
大多数函数的栈帧的边界都必须是16字节的倍数。(这个要求有一些例外。)
较近版本的x86-64处理器实现了AVX多媒体指令。除了提供SSE指令的超集,支持AVⅩ的指令并没有强制性的对齐要求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值