编译时和运行时、OC中对象的动态编译机制
编译时
编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)
那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.
运行时
所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.
sizeo是在栈中操作的,编译的时候就会计算出来sizeof的值
栈是在编译完成后产生的,编译的结果是二进制机器文件,即汇编栈已经产生,所以栈内不能放类的对象,因为产生栈的时候不知道父类的大小
总之一句话,父类的详细情况对于调用其子类的栈来说是封闭的,而结构体相对于调用它的栈来说是暴露的。
OC中的动态继承编译机制是在编译的时候不把父类详细情况暴露给调用子类的栈,而是在运行的时候才把父类的详细情况暴露给调用子类的栈
转载于:https://www.cnblogs.com/dannygao/p/6959188.html
编译时和运行时、OC中对象的动态编译机制相关推荐
- 什么叫编译时和运行时
以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能 ...
- JVM编译时和运行时状态
1.jvm对成员变量和成员方法和绑定机制只有两种: 一种是:静态绑定,一种是动态绑定.(在子类和父类上才会出现动态和静态的绑定) 2.我们总结:只有实例方法是动态绑定,其他全部是静态绑定
- java编译时为什么总找不到文件,javac编译时找不到文件的问题和运行项目找不到指定类问题...
问题描述: 刚刚安装完JDK,打开Eclipse创建一个新项目,写了一个测试类进行输出打印语句时,报无法找到相应类. 然后,我跑到CMD中进行javac Test.java运行测试时,报找不到对应文件 ...
- c#编译时提高兼容性_幻像类型提高了编译时的安全性
c#编译时提高兼容性 介绍 使用幻像类型是一种非常简单的技术,可用于提高代码的编译时安全性. 有很多潜在的用例,其复杂性程度各不相同,但是即使幻像类型的轻量级使用也可以显着提高编译时的安全性. 幻像类 ...
- 理解JVM中对象与垃圾回收机制
目录 一.虚拟机中对象的创建过程 1.检查加载 2.分配内存 3.内存空间初始化 4.设置(主要是对象头信息) 5.对象初始化 二.对象的内存布局 三.对象的访问定位 四.判断对象存活 五.各种引用 ...
- Eclipse使用gradle编译时,使用固定的jdk版本进行编译(修改gradle的jdk编译版本)
很多时候我们使用多个版本的jdk,比如说,用的是1.7 ,开发环境用1.8 那么经常碰到编译后的包是1.8版本的,虽然设置了1.7的,因为很多时候我们使用打包工具了. 1.7和1.8有个问题就是1.8 ...
- gradle 指定java版本_Eclipse使用gradle编译时,使用固定的jdk版本进行编译(修改gradle的jdk编译版本)...
很多时候我们使用多个版本的jdk,比如说,用的是1.7 ,开发环境用1.8 那么经常碰到编译后的包是1.8版本的,虽然设置了1.7的,因为很多时候我们使用打包工具了. 1.7和1.8有个问题就是1.8 ...
- linux编译时开启宏,【spec】Linux上编译安装的spec文件中的常用路径以及宏变量
我们在Linux上利用 rpmbuild 构建 rpm 安装包时,通过命令rpm --showrc 查看实现代码,另外直接通过 rpm --eval "%{macro}"来查看具体 ...
- OC中对象的description方法
周所周知,我们在做项目时, 可以在类的.m文件中重写该类的对象的描述description方法: 示例: -(NSString *)description { NSString *str = ...
最新文章
- C++:随笔9----模板/内联函数/容器
- ScalaPB(4): 通用跨系统protobuf数据,sbt设置
- 怎么用pycharm更新python_利用PyCharm操作Github(仓库新建、更新,代码回滚)
- 【Python】Python库之图形用户界面
- python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)
- Bootstrap 使用Less变量
- 【clickhouse】clickhouse时区
- UILabel小技巧
- java adt is保存快捷键_实用的eclipse adt 快捷键
- canvas drawImage() 方法绘制图片与视频
- 【Cadence】制作AD630焊盘SOIC_20
- protel 99se 简单的手动画pcb
- Jmeter的面试题集
- 2019不是闰年php代码,2019年是闰年吗,2019年有闰月吗?
- Android开发必备知识
- 刘彬20000词汇05
- ❤️大学三年沉淀,把我的学习经验分享给你,爆肝万字带你走进编程世界!❤️
- Android掌上医疗预约挂号系统app
- win7 查看php版本信息,window_Windows系统版本怎么看?2种查看windows版本的方法介绍,前段时间微软正式开始向Win7和 - phpStudy...
- 数据库(MySQL)基础