hao—C++和Java从编译到运行的过程区别

以下内容纯属臆测,没有科学依据,也不想(没空)翻看权威资料。


一、C++编译和运行过程


1、C++每个编译单元整体上看都是各种声明和定义

    C++编译单元就是指每个cpp文件,整体上看(全局的东西,函数内部不算,类定义内部不算)无非就是变量(包括类的实例也算变量)、函数或者类的声明和定义。其中变量占用内存空间,存放在运行时的“全局区”,这个内存空间的数据一般是可变的,可以随时被修改;函数(体)不占用内存空间(本质上也占用,因其编译完后变成一堆永远不变的纯用来运行的代码或称指令,而且占用空间较少,哪怕很大的程序编译完后纯代码也不大,所以讨论时常常认为其不占用空间),存放在“代码区”,其内容永不被改变;类(体)没有专门的存放区,因为在运行时根本不存在类了(纯个人愚见),就像基本类型int一样,任何类型在运行期都不起作用了,运行时本质(或者说全部的工作)就是“从某块内存读数据进入cpu,或者把cpu的数据存放入某块内存,或者cpu内部进行运算”,任何类型只在编译期有用,被编译器用来进行错误检查等,防止不同类型的变量混杂使用,防止出现一些非常难查找的异常,所以说类体只在编译时有用,被编译器使用,把函数内用到的类的成员翻译成一个个带有复姓的长名字,如类名.成员名,其中碰到new 类名时,就翻译成调用类的构造函数(对运行期来说就是一个地址而已),总之类的成员(非静态,静态的东西本质就是全局的)不可能出现在全局定义的地方,也即不可能存放在全局区,当然可以在全局的地方定义一个类的实例,编译器对待他和对待普通变量没什么区别,只不过占用的内存空间稍微大了些而已。


2、符号表的作用(编译和链接过程)

    先看编译过程,C++编译器使用符号表,运行时就不用符号表了。符号表简单理解为具有三列的表格(符号名、类型、内容),只有变量、函数和类能进入符号表中,其中类型列对于变量来说是描述该符号怎么分配内存和初始化,类型列对于类来说就是类里面含有什么成员,怎么进行成员初始化,内容列对于变量来说就是变量存放的具体数据(包括对象变量也是),内容列对于函数来说就是函数代码体的首地址,内容列对于类来说是空的,不用的。C++编译每个文件时,第一步从整体上扫描,无非就是声明和定义,把所有定义的东西都装进那个.cpp文件对应的符号表,就产生了符号表;第二步进行局部扫描,也称错误检查,首先进行符号检查,就是扫描函数体和类体,碰到不认识的符号,先看该符号有没有在本cpp文件声明,如果声明了就把当前符号记录成问号(如 普通变量x和对象变量stu翻译如下,x = 15翻译成x? = 15,stu.no =10 0翻译成stu?.第三个内存单元 = 100),如果符号没事先声明,也不在本cpp的符号表里头,那就报错;然后对函数体和类体进行语法错误检查

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值