深入理解计算机系统笔记
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 一文中我们介绍了一种常见的错误提示信息。这里,我们使用类似的代码,介绍另一种提示错误提示信息。 正文 有时候,当我们在…...
FanControl:彻底解决Windows电脑风扇噪音与散热问题的终极方案
FanControl:彻底解决Windows电脑风扇噪音与散热问题的终极方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tre…...
GNSS定位质量分析实战:如何利用PPP-B2b提升GPS/BDS的PDOP与可视卫星数?
GNSS定位质量优化实战:PPP-B2b如何重塑多系统联合定位性能 当高精度定位成为自动驾驶、精准农业和地质监测等领域的基础需求时,GNSS系统的性能优化便成为工程师们必须面对的课题。北斗三号全球系统新增的PPP-B2b服务,为亚太区域用户提供了开…...
第X篇 zephyr kernel之工作队列实战:从系统队列到自定义队列的进阶应用
1. 工作队列基础:从Linux到Zephyr的思维迁移 第一次接触Zephyr工作队列时,我习惯性地用Linux的思维去理解它,结果踩了不少坑。这里分享下我的理解过程:Zephyr的工作队列确实借鉴了Linux的设计理念,但在资源受限的MCU上…...
安卓应用级虚拟定位:FakeLocation Xposed模块的三大革新
安卓应用级虚拟定位:FakeLocation Xposed模块的三大革新 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的开源安卓虚拟定位工具&am…...
10个VJEPA2实战应用场景:从视频分类到机器人操作
10个VJEPA2实战应用场景:从视频分类到机器人操作 【免费下载链接】vjepa2 PyTorch code and models for VJEPA2 self-supervised learning from video. 项目地址: https://gitcode.com/gh_mirrors/vj/vjepa2 VJEPA2(Video Joint-Embedding Predic…...
DeerFlow进阶教程:集成MCP服务,扩展你的AI助理工具箱
DeerFlow进阶教程:集成MCP服务,扩展你的AI助理工具箱 认识一下DeerFlow,你的个人深度研究助理。它已经内置了强大的网络搜索、Python代码执行和报告生成能力。但今天,我们要让它变得更强大——通过集成MCP(Model Cont…...
SUPER COLORIZER显存优化技巧:低配置GPU也能流畅运行
SUPER COLORIZER显存优化技巧:低配置GPU也能流畅运行 你是不是也遇到过这种情况?看到别人用SUPER COLORIZER模型把黑白老照片变得色彩鲜艳,自己也想试试,结果一运行,显卡显存直接爆满,程序崩溃,…...
【2026奇点智能技术大会权威解码】:多模态导航如何重构LBS服务底层逻辑?
第一章:2026奇点智能技术大会:多模态导航应用 2026奇点智能技术大会(https://ml-summit.org) 多模态导航正从实验室走向城市级基础设施,2026奇点智能技术大会首次系统展示了融合视觉、语音、LiDAR与高精语义地图的端到端导航框架。该框架在东…...
Java 面向对象三大特性之封装
面向对象是 Java 语言的核心思想,而封装、继承、多态被称为面向对象的三大特性。其中,封装是最基础、最重要的特性,它为程序的安全性、可维护性和模块化设计提供了重要保障。封装,简单来说,就是把对象的状态࿰…...
终极Duckling部署与优化指南:打造高性能生产环境的完整方案
终极Duckling部署与优化指南:打造高性能生产环境的完整方案 【免费下载链接】duckling Language, engine, and tooling for expressing, testing, and evaluating composable language rules on input strings. 项目地址: https://gitcode.com/gh_mirrors/du/duck…...
