深入理解计算机系统笔记
1.1 嵌套的数组
当我们创建数组的数组时,数组分配和引用的一般原则也是成立的。
例如,声明 int A[5][3];
等价于下面的声明
typedef int row3_t[3];
row3_t A[5]
要访问多维数组的元素,编译器会以数组起始为基地址, (可能需要经过伸缩的)偏移量为索引,产生计算期望的元素的偏移量,然后使用某种 MOV指令。通常来说,对于一个 声明如下的数组:
T D[R][C];
它的数组元素D[i][j]的内存地址为
&D[i][j]= Xd +L(C*i+ j)
这里L是数据类型T以字节为单位的大小。
1.2定长数组
C语言编译器能够优化定长多维数组上的操作代码。这里我们展示优化等级设置为 -01时GCC采用的一些优化。假设我们用如下方式将数据类型fixjnatrix声明为 16X16 的整型数组:
#define N 16;
typedef int fix_matrix[N][N];
这样做的好处是,如果需要修改这个值只需要简单的修改这个# define声明就可以了。
1.3 变长数组
历史上,C语言只支持大小在编译时就能确定的多维数组(对第一维可能有些例外)。 程序员需要变长数组时不得不用malloc或calloc这样的函数为这些数组分配存储空间,而且不得不显式地编码,用行优先索引将多维数组映射到一维数组,ISO C99引入了一种功能,允许数组的维度是表达式,在数组被分配的时候才计算出来。
在变长数组的C版本中,我们可以将一个数组声明如下:
int A[expr1] [expr2];
它可以作为一个局部变量,也可以作为一个函数的参数,然后在遇到这个声明的时候,通过对表达式和求值来确定数组的维度。
因此,例如要访问 n *n 数组的元素 I ,j,我们可以写一个如下的函数:
int var_ele(long n, int A[n][n], long i, long j){
return A[i][j]; }
参数n必须在参数A[n][n]之前,这样函数就可以在遇到这个数组的时候计算出数组的维度。
GCC为这个引用函数产生的代码如下所示:
int var_ele(long n, int A[n][n], long i, long j)
n in %rdi, A in %rsi, i in %rdx, j in %rcx
1 var_ele:
2 imulq %rdx, %rdi
3 leaq (%rsi,%rdi*4), %rax
4 movl (%rax,%rcx,4), %eax
5 ret
这 个地址的计算类似于定长数组的地址计算,不同点在于
1)由于增加了参数 n, 寄存器的使用变化了;
2)用了乘法指令来计算n * i(第2行),而不是用leaq指令来计算3i 。因此引用变长数组只需要对定长数组做一点儿概括。
动态的版本必须用乘法指令对 i 伸缩n倍,而不能用一系列的移位和加法。在一些处理器中,乘法会招致严重的性能处 罚,但是在这种情况中无可避免。
2.1异质的数据结构
C语言提供了两种将不同类型的对象组合到一起创建数据类型的机制:结构(structure),用关键字 struct 来声明,将多个对象集合到一个单位中;联合(union),用关键 字union 来声明,允许用几种不同的类型来引用一个对象
2.2结构
C语言的struct声明创建一个数据类型,将可能不同类型的对象聚合到一个对象中。 用名字来引用结构的各个组成部分。类似于数组的实现,结构的所有组成部分都存放在内存中一段连续的区域内,而指向结构的指针就是结构第一个字节的地址。编译器维护关于每个结构类型的信息,指示每个字段(field)的字节偏移。它以这些偏移作为内存引用指令中的位移,从而产生对结构元素的引用。
2.3联合
联合提供了一种方式,能够规避C语言的类型系统,允许以多种类型来引用一个对 象。联合声明的语法与结构的语法一样,只不过语义相差比较大。它们是用不同的字段来引用相同的内存块。
考虑下面的声明: struct S3{
char c;
int i[2];
double v;
};
union U3{
char c;
int i[2];
double v;
};
在一台x86-64Lmux机器上编译时,字段的偏移量、数据类型S3和U3的完整大小如下:

在一些下上文中,联合十分有用。但是,它也能引起一些讨厌的错误,因为它们绕过 了C语言类型系统提供的安全措施。一种应用情况是,我们事先知道对一个数据结构中的两个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分,而不是结构的一 部分,会减小分配空间的总量。
2.4数据对齐
许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地 址必须是某个值K(通常是2、4或8)的倍数。这种对齐限制简化了形成处理器和内存系统 之间接口的硬件设计。
例如,假设一个处理器总是从内存中取8个字节,则地址必须为8 的倍数。如果我们能保证将所有的double类型数据的地址对齐成8的倍数,那么就可以 用一个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。
对齐原则是任何K字节的基本对象的地址必须是K•的倍数。可以 看到这条原则会得到如下对齐:

确保每种数据类型都是按照指定方式来组织和分配,即每种类型的对象都满足它的对齐限制,就可保证实施对齐。编译器在汇编代码中放人命令,指明全局数据所需的对齐。
相关文章:
深入理解计算机系统笔记
1.1 嵌套的数组 当我们创建数组的数组时,数组分配和引用的一般原则也是成立的。 例如,声明 int A[5][3]; 等价于下面的声明 typedef int row3_t[3]; row3_t A[5] 要访问多维数组的元素,编译器会以数组起始为基地址, (可能需…...
300分钟吃透分布式缓存(拉钩教育总结)
开篇寄语 开篇寄语:缓存,你真的用对了吗? 你好,我是你的缓存老师陈波,可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚,经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…...
2024亚马逊全球开店注册前需要准备什么?
在2023年出海四小龙SHEIN、Temu、速卖通AliExpress、TikTok Shop快速增长扩张,成为了中国跨境卖家“逃离亚马逊”的新选择。但是,跨境电商看亚马逊。当前,亚马逊仍然是跨境电商行业的绝对老大,占有将近70%成以上的业务份额。 作为…...
android Service 与 activity 通信 并不断传数据
注:这只是个Demo 以下载为案例,实现开启下载,暂停下载,下载进度不断发送给activity class DownloadService : Service() {override fun onBind(intent: Intent?): IBinder? {return MyBinder()}inner class MyBinder : Binder…...
Acwing-基础算法课笔记之数学知识(扩展欧几里得算法)
Acwing-基础算法课笔记之数学知识(扩展欧几里得算法) 一、扩展欧几里得算法1、裴蜀定理2、过程模拟3、代码模板 二、线性同余方程1、定义2、模拟过程3、结论证明 一、扩展欧几里得算法 1、裴蜀定理 对于任意正整数 a a a, b b b࿰…...
简单排列组合题(python版)
文章预览: 题目解法一输出结果 解法二输出结果输出结果 题目 有四个数字:1,2,3,4能组成多少个互不相同且无重复的数字的三位数? 各式多少? 解法一 我们粗略看一下这个题既然我们要组成三位数,那我们就循环3层每一层出一个数,并且if语句判…...
【排坑】搭建 Karmada 环境
git clone 报错 问题:Failed to connect to github.com port 443:connection timed out 解决: git config --global --unset http.proxy【hack/local-up-karmada.sh】 1. karmada ca-certificates (no such package) 问题:fetching http…...
每日一类:Qt GUI开发的基石《QWidget》
深入探索QWidget:Qt GUI开发的基石 在Qt框架中,QWidget类扮演着构建图形用户界面(GUI)的基础角色。它不仅提供了窗口的基本功能,还允许开发者通过继承和定制来创建各式各样的用户界面元素。本文将详细介绍QWidget的关…...
人大金仓与mysql的差异与替换
人大金仓中不能使用~下面的符号,字段中使用”,无法识别建表语句 创建表时语句中只定义字段名.字段类型.是否是否为空 Varchar类型改为varchar(长度 char) Int(0) 类型为int4 定义主键:CONSTRAINT 键名 主键类型&#x…...
Excel2LaTeX插件的使用、LaTeX表格
目录 一、下载Excel2Latex 二、使用Excel2Latex 1、将Excel2LaTeX文件添加到加载项 2、导出LaTex的表格数据 3、注意事项 1)生成的latex表格断断续续问题 2)改变线形的粗细 3)表格太大,需要缩小到适应大小 4)…...
MySQL 用了哪种默认隔离级别,实现原理是什么?
MySQL 的默认隔离级别是 RR - 可重复读,可以通过命令来查看 MySQL 中的默认隔离级别。 RR - 可重复读是基于多版本并发控制(Multi-Version Concurrency Control,MVCC )实现的。MVCC,在读取数据时通过一种类似快照的方…...
【C++初阶】第四站:类和对象(下)(理解+详解)
前言: 本篇知识点:初始化列表、explicit关键字、static成员、友元、内部类、匿名对象、编译器的优化 专栏:C初阶 目录 再谈构造函数 1️⃣构造函数体赋值 2️⃣初始化列表 explicit关键字 static成员 1.static概念 2.static特性 面试…...
redis的基本数据类型(一)
redis的基本数据类型 1、redis1.1、数据库分类1.2、NoSQL分类1.3、redis简介1.4、redis应用1.5、如何学习redis 2、redis的安装2.1、Windows安装2.2.1、客户端redis管理工具 2.2、Linux安装🔥2.2.1、redis核心文件2.2.2、启动方式2.2.3、redis桌面客户端1、redis命令…...
Windows无法识别exFAT格式怎么办?
Windows通常无法读取Mac格式的驱动器。如果使用Apple的HFS Plus将驱动器格式化为exFAT,默认情况下Windows无法读取exFAT驱动器,即使exFAT文件系统与Mac和Windows兼容。事实上,一些制造商销售的“Mac驱动器”是用这种限于Mac的文件系统预先格式…...
AI大模型的发展趋势?
大模型的发展趋势主要体现在以下几个方面: 1、模型规模的增长: 随着数据量和计算能力的不断增加,大型模型的规模也在不断扩大。模型参数数量、层数等指标不断刷新,以应对更复杂的任务和更大规模的数据。 2、多模态融合ÿ…...
List去除重复数据的五种方式
1、使用 LinkedHashSet 删除 arraylist 中的重复数据 LinkedHashSet 是在一个 ArrayList 删除重复数据的最佳方法。LinkedHashSet 在内部完成两件事: 删除重复数据 保持添加到其中的数据的顺序 Java 示例使用 LinkedHashSet 删除 arraylist 中的重复项。在给定的示例…...
VUE3自定义文章排行榜的简单界面
文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"article-ranking"><div class"header"><h2 class"title">{{ title }}</h2></div><div class"ranking-list&qu…...
七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造,最高工作电压 50V,耐压 80V
GC2003 内部集成了 7 个 NPN 达林顿晶体管,连接的阵列,非常适合逻辑接口电平数字电路(例 如 TTL,CMOS 或PMOS 上/NMOS)和较高的电流/电压,如电灯电磁阀,继电器,打印机或其他类似的负…...
若依springboot接入feign踩坑记录
问题情境: 简单的项目采用了若依的前后端分离版本单体应用,之前采用forest请求调用第三方接口,改为feign接口调用后,引入feign报错 error creating bean with name ‘configurationPropertiesbean’ 解决方案: spri…...
Lumerical Script ------ Error: <文件目录> line x:syntax error
Lumerical Script ------ Error: <文件目录> line x:syntax error 引言正文引言 在 Lumerical Script ------ Error: line 0: syntax error 一文中我们介绍了一种常见的错误提示信息。这里,我们使用类似的代码,介绍另一种提示错误提示信息。 正文 有时候,当我们在…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
