当前位置: 首页 > wzjs >正文

找网站公司企业备案2008iis网站属性

找网站公司企业备案,2008iis网站属性,专业免费建站,海东企业网站建设公司目录 变量的本质:从语法到机器的还原 编译器如何看待 A[i]? 推导地址公式 现在假设:数组下标从 1 开始 为什么这很关键? 我们先从最基础的一句代码开始,切入 C 背后运行机制的本质。 int x 10;变量的本质&#…

目录

变量的本质:从语法到机器的还原

编译器如何看待 A[i]?

推导地址公式

现在假设:数组下标从 1 开始

为什么这很关键?


我们先从最基础的一句代码开始,切入 C++ 背后运行机制的本质。

int x = 10;

变量的本质:从语法到机器的还原

 一、你看到的是“名称”,编译器看到的是“地址偏移”

 对我们程序员而言:你看到的是一个叫 x 的变量,它有一个值 10,你可以用名字来访问它。

对编译器而言:

编译器不关心“名字”这个表面现象,它做了几步语义转换:

二、编译器如何处理 int x = 10;

步骤 1️⃣:符号表建立

  • 编译器创建一个“符号表(Symbol Table)”

  • 它记录:x 是一个类型为 int 的变量

  • 它将 x 映射到一个相对地址/偏移量

名称类型相对地址偏移(或栈位置)
xint-4(例如)

步骤 2️⃣:分配内存(通常在栈区)

  • 如果 x 是局部变量,它会在栈区分配,例如偏移 4 字节的位置:

RBP - 4(假设栈帧指针为 RBP)

步骤 3️⃣:生成机器码

在汇编中,这句代码可能被翻译成类似这样的指令(以 x86 为例):

mov DWORD PTR [rbp-4], 10
  • 这里根本没用到 x 这个名字

  • 编译器已经将名字映射成地址偏移

  • 程序运行时,CPU 只认地址,不认变量名

“编译器在编译期会将变量名转化为内存地址的符号引用(或偏移地址),运行时,内存通过这些地址定位变量,而不是通过变量名。” 

举个类比:变量名是标签,地址是具体的柜子编号

概念类比
int x = 10;给办公室里第 7 个柜子贴了个标签 “x”,放进去一个文件夹“10”
编译器把“x”看成“第7个柜子”,扔掉标签,只记住位置
CPU只知道哪个柜子编号,完全不认“x”

如果我现在有一个数组:

int A[5] = {1, 2, 3, 4, 5};
A[2] = 8;

你会怎么想象这个 A

本质:数组是“一组连续的变量”

编译器看到 int A[5],就会说:

好的,我要分配连续的 5 个 int 类型单元(假设每个占 4 字节),并用 A 来表示第一个元素的地址。

内存布局图(假设 A[0] 从地址 0x1000 开始):

地址元素
0x1000A[0]1
0x1004A[1]2
0x1008A[2]3 → 将被改为 8
0x100CA[3]4
0x1010A[4]5

编译器如何看待 A[i]

数组访问表达式:

A[i] ≡ *(A + i)

编译器知道:

  • A 是数组首元素地址(即 &A[0]

  • i 是第几个元素

  • A + i 是“第 i 个元素的地址”

  • *(A + i) 是“该地址上的值”


推导地址公式

我们要知道访问 A[i] 时编译器如何计算地址。

假设:

  • A 是从地址 BaseAddress 开始的数组

  • 每个元素的大小为 sizeof(int) = 4 字节

  • i 是下标

✅ 编译器计算地址的公式:

地址 = BaseAddress + i × sizeof(元素类型)

 对于 int A[5] = {1,2,3,4,5}; 来说:

A[i] ≡ *(BaseAddress + i * 4)

例如:A[2] = 8;

编译器看到的是: 

*(A + 2) = 8;

 等价于:

*(0x1000 + 2 * 4) = 8;  → *(0x1008) = 8;

 所以 A[2] 的地址是 0x1008,它的值将被改为 8。

最终公式

对于 type A[n];,访问 A[i] 时的真实地址为: 

地址(A[i]) = BaseAddress + i × sizeof(type)

访问 A[i] 的表达式会在汇编中变为指针解引用:

mov [base + i * sizeof(type)], value

现在假设:数组下标从 1 开始

我们还写:

int A[5];   // A[1] 到 A[5] 表示 5 个元素

你想访问 第一个元素,写 A[1],那它该对应哪里?

你希望的逻辑是:

A[1] = Base + 0 × sizeof(int)
A[2] = Base + 1 × sizeof(int)
A[3] = Base + 2 × sizeof(int)

 这意味着——你想要让 A[i] 实际上访问第 i - 1 个元素。

从下标从 1 的假设,推导出地址公式:

地址(A[i]) = Base + (i - 1) × sizeof(int)

对比一下:

下标起点地址计算公式
0Base + i × size
1Base + (i - 1) × size 

⚠️ 这就意味着:每次访问元素,都需要多做一次减法运算:i - 1

为什么这很关键?

编译器层面:

  • 每次都需要在地址计算前加一步整数减法

  • 这虽然看起来只是一条指令,但在高频访问场景(如循环、矩阵乘法)下就是瓶颈

  • 汇编也会变复杂:

mov eax, [base + (i - 1) * 4]   //  多了一步计算

缺点:

  • 每次访问多一条减法指令,会大大拖慢程序运行时间

  • 指针运算 *(A + i) 不再与 A[i] 等价

  • 编译器优化更复杂,性能更差

为什么下标从 0 更合理?

原因解释
逻辑映射自然i 个元素偏移量刚好是 i × size
无需额外计算省去 (i - 1) 减法运算
指针算法兼容性A[i] 等价于 *(A + i),自然对应第 i 个地址偏移
简洁与一致性在计算偏移、数组访问、指针解引用时更统一
性能最优尤其在嵌套循环或密集数组访问中,省指令就省 CPU 周期

历史传承也符合这个设计哲学

  • C 语言的设计来自于 B / BCPL,这些语言从一开始就使用指针 + 偏移

  • 数组其实就是语法糖,真正访问是指针加法:*(base + i)

  • 如果下标从 1 开始,那这个“语法糖”就破坏了这种自然性

所以,数组下标从 0 开始是最自然、最高效的内存映射设计,而非语言习惯! 


文章转载自:

http://wnsKo9G0.mzjbz.cn
http://ALIq4MvL.mzjbz.cn
http://jelXcMed.mzjbz.cn
http://J7szJrTk.mzjbz.cn
http://McehmdRy.mzjbz.cn
http://GvB9zGk2.mzjbz.cn
http://eIE7qqCp.mzjbz.cn
http://vQOy33LF.mzjbz.cn
http://vaB3ZyKa.mzjbz.cn
http://cGKy4FQk.mzjbz.cn
http://Ljtpvo87.mzjbz.cn
http://y7J2M4nq.mzjbz.cn
http://q9tZWGmx.mzjbz.cn
http://3UPWPwHQ.mzjbz.cn
http://sv0lirYs.mzjbz.cn
http://aRhX0sD4.mzjbz.cn
http://8tWN3ZHL.mzjbz.cn
http://WF3ZA1JA.mzjbz.cn
http://PJAbKcgB.mzjbz.cn
http://WF6fZqkH.mzjbz.cn
http://a9n2HnN4.mzjbz.cn
http://EAsIImnj.mzjbz.cn
http://Xk1rg9lt.mzjbz.cn
http://D63pSzsy.mzjbz.cn
http://gGRy9mCF.mzjbz.cn
http://MIuApqzi.mzjbz.cn
http://G4ATn3sb.mzjbz.cn
http://5oBno6V0.mzjbz.cn
http://Cx9vFzBT.mzjbz.cn
http://4DgBWTzJ.mzjbz.cn
http://www.dtcms.com/wzjs/640863.html

相关文章:

  • 网站后端开发是什么广州网站建设流程图
  • 上海微信网站建设公司电话做微网站价格
  • 电商网站构建北京sem网站
  • 探测网站是什么程序做的做数据的网站有哪些
  • 合肥做网站推广哪家好深圳建设工程协会网站
  • 企业网站建设问题电子商务网站的建设与规划论文
  • 网站建设出现401祥符网站建设
  • 以前自己做的网站怎么样删除用vuejs做的网站
  • 用网站的源代码怎么做网站长沙有实力的关键词优化价格
  • 宁阳网站建设价格哪些网站教你做系统
  • 南昌网站建设好么有关做网站项目的毕业答辩
  • 网站建设方案书腾讯云百度公司介绍
  • 网站开发html书籍下载企业品牌网站建设
  • 医疗网站优化深圳专业做网站的公司有哪些
  • 推广自己的网站企业采购平台排名
  • 专业网站开发价格河南省建设厅八大员网站
  • 网站集约化建设需求wordpress 批量审核
  • 网站建设具体工作内容重庆渝中区企业网站建设联系电话
  • 深圳网站设计官网平面设计主要学哪些软件
  • 网站推广是做什么的外包公司
  • 网站配色案例重庆网站建设哪家好
  • 苏州网站外包广告艺术设计学什么
  • 一般网站空间要多大wordpress加ssl
  • 外地人网站备案微网站上的一键导航怎么做
  • 开发客户的70个渠道安徽网站优化多少钱
  • 网站开发套餐品牌网络推广怎么做
  • 湖北省住房城乡建设厅网站查企业管理六大体系
  • 做淘宝货源网站莱芜如何选择网站建设
  • 网站建设合同不给版权全响应式网站用什么做的
  • 网站404是什么意思typecho跟wordpress