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Ⅹ的指令并没有强制性的对齐要求。

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

  1. 3、深入理解计算机系统笔记:程序的机器级表示

    1.Intel现在称其指令集为IA32,即Intel 32位体系结构(Intel Architecture 32-bit),这个处理器也俗称为"x86". 2.Linux使用了平面 ...

  2. 深入理解计算机系统_第三章_程序的机器级表示

    深入,并且广泛-沉默犀牛 文章目录 文章导读 历史观点 程序编码 机器级代码 代码示例 关于格式的注解 数据格式 访问信息 操作数指示符 数据传送指令 数据传送示例 压入和弹出栈数据 算术和逻辑操作 ...

  3. 读书笔记——《深入理解计算机系统》第三章_程序的机器级表示(一)

    前言:已经大四,没有去找工作,选择了保研,之所以这样选择,有三个原因,一.刚进校时,听说保研都是牛人才能行的事,所以一心努力保研:二.2008年开始,经济危机比较严重,工作不好找,虽然软件专业要找一份 ...

  4. 《深入理解计算机系统》学习笔记:程序的机器级表示

    目录 概述 一.历史观点 二.程序编码 2.1.机器级代码 2.2.代码示例 2.3.关于格式的注解 三.数据格式 四.访问信息 4.1.操作符指示符 4.2.数据传送指令 4.2.1.源操作数和目的 ...

  5. 【笔记】程序的机器级表示

    参考书籍:<深入理解计算机系统> 基本概念 ISA 指令集架构(Instruction Set Architecture):定义机器级程序的格式和行为,它定义了处理器状态.指令的格式,以及 ...

  6. 【《深入理解计算机系统》读书笔记(3)】 第3章 程序的机器级表示

    [时间]2021.11.19 [题目]<深入理解计算机系统>读书笔记(3)  第3章 程序的机器级表示 目录 一.简介 二.一些重点图 1.常见数据类型格式 2.16个整数寄存器 3.寄存 ...

  7. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  8. 深入理解计算机系统 第3章 程序的机器级表示

    目录 第3章 程序的机器级表示 数据格式 操作数指示符 练习题 数据传送指令 习题3.4 访问信息 压入和弹出栈数据 算数和逻辑操作 移位操作 讨论 特殊的算数操作 问题 第3章 程序的机器级表示 数 ...

  9. bilibili深入理解计算机系统笔记(1):汇编模拟器能跑了

    文章目录 深入理解计算机系统笔记 P1笔记 p2笔记 p3笔记 p4笔记 汇编模拟器(p5-7) 封装访存接口 输出计算机状态 实现指令 call指令的实现 bug 积累 include重复包含的bu ...

最新文章

  1. 文件打包成zip类型文件
  2. Android 学习指南(2017版)
  3. android京东加入购物车效果,京东360buy 手机项目的“加入购物车”动画效果研究...
  4. (*长期更新)软考网络工程师学习笔记——Section 9 应用层
  5. Hibernate提高性能的几点建议
  6. ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成
  7. Android 系统(261)---SIM卡不识或者掉卡简单分析
  8. 怎么成为日上会员直邮_手把手教你玩转各大免税店直邮方法,再也不用担心真假代购...
  9. 盘点实际项目应用中的最佳机器学习模型
  10. 采用install.sh安装脚本进行快速安装astercc
  11. unable to bind to locking port 7054 within 45000 ms
  12. 每天学一点flash(67) 上传图片
  13. 怎么用EasyRecovery把文件夹中丢失的数据恢复
  14. linux下c编程常识
  15. DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则
  16. 微信公号开发之自定义菜单攻略
  17. 整理 kanban 的 DoR 和 DoD
  18. 【科创人独家】军哥手记程军:我的2020,先打个60分吧
  19. java小游戏-java小游戏-大鱼吃小鱼
  20. 连接tcp服务器出现的问题及解决方法

热门文章

  1. 钟景华:相关规范或明年发布,大型和超大型数据中心PUE小于1.3/WUE小于1.6
  2. 学姐给我的C语言打机枪代码(有声音哦)
  3. wms仓库管理系统的核心功能及作用
  4. python也很浪漫一朵玫瑰送给小姐姐
  5. mysql squence分布式,xsequence分布式序列号生成组件1.0版本终于发布了
  6. 哨兵2a 波段组合_基于多时相Sentinel-2A的县域农作物分类
  7. 【Lua编程基础】实测Lua中点和冒号的区别
  8. 程序员经典电子书下载(超全)
  9. windows+vscode配置C++环境
  10. 用 SimCLR 提高自监督与半监督学习效果