编译时

编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

运行时

所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.

1、为什么OC不能sizeof一个对象的大小?和类结构相近的结构体却可以 
因为oc的动态继承编译机制,动态继承机制,就是说在编译的时候不能确定父类的大小,只有在运行时才能确定父类大小,

sizeo是在栈中操作的,编译的时候就会计算出来sizeof的值

而栈中不知道对象的父类大小,所以不能使使用sizeof计算出对象的大小
2、为什么OC不能将对象声明到静态空间,如栈中,和类相近的结构体却可以

栈是在编译完成后产生的,编译的结果是二进制机器文件,即汇编栈已经产生,所以栈内不能放类的对象,因为产生栈的时候不知道父类的大小

栈是由汇编代码指令描述的
为什么结构体可以直接寄计算sizeof,也能直接声明到静态空间呢?
为什么结构体不管定义在栈中或堆中都能直接sizeof?因为定义到堆中的时候已经知道了结构体的大小,因为结构体对于调用它的代码产生的栈而言是暴露的。
是因为结构体定义的头文件直接把结构体的属性暴露给了栈,所以可以直接声明到静态空间

总之一句话,父类的详细情况对于调用其子类的栈来说是封闭的,而结构体相对于调用它的栈来说是暴露的。

OC中的动态继承编译机制是在编译的时候不把父类详细情况暴露给调用子类的栈,而是在运行的时候才把父类的详细情况暴露给调用子类的栈

转载于:https://www.cnblogs.com/dannygao/p/6959188.html

编译时和运行时、OC中对象的动态编译机制相关推荐

  1. 什么叫编译时和运行时

    以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能 ...

  2. JVM编译时和运行时状态

    1.jvm对成员变量和成员方法和绑定机制只有两种: 一种是:静态绑定,一种是动态绑定.(在子类和父类上才会出现动态和静态的绑定) 2.我们总结:只有实例方法是动态绑定,其他全部是静态绑定

  3. java编译时为什么总找不到文件,javac编译时找不到文件的问题和运行项目找不到指定类问题...

    问题描述: 刚刚安装完JDK,打开Eclipse创建一个新项目,写了一个测试类进行输出打印语句时,报无法找到相应类. 然后,我跑到CMD中进行javac Test.java运行测试时,报找不到对应文件 ...

  4. c#编译时提高兼容性_幻像类型提高了编译时的安全性

    c#编译时提高兼容性 介绍 使用幻像类型是一种非常简单的技术,可用于提高代码的编译时安全性. 有很多潜在的用例,其复杂性程度各不相同,但是即使幻像类型的轻量级使用也可以显着提高编译时的安全性. 幻像类 ...

  5. 理解JVM中对象与垃圾回收机制

    目录 一.虚拟机中对象的创建过程 1.检查加载 2.分配内存 3.内存空间初始化 4.设置(主要是对象头信息) 5.对象初始化 二.对象的内存布局 三.对象的访问定位 四.判断对象存活 五.各种引用 ...

  6. Eclipse使用gradle编译时,使用固定的jdk版本进行编译(修改gradle的jdk编译版本)

    很多时候我们使用多个版本的jdk,比如说,用的是1.7 ,开发环境用1.8 那么经常碰到编译后的包是1.8版本的,虽然设置了1.7的,因为很多时候我们使用打包工具了. 1.7和1.8有个问题就是1.8 ...

  7. gradle 指定java版本_Eclipse使用gradle编译时,使用固定的jdk版本进行编译(修改gradle的jdk编译版本)...

    很多时候我们使用多个版本的jdk,比如说,用的是1.7 ,开发环境用1.8 那么经常碰到编译后的包是1.8版本的,虽然设置了1.7的,因为很多时候我们使用打包工具了. 1.7和1.8有个问题就是1.8 ...

  8. linux编译时开启宏,【spec】Linux上编译安装的spec文件中的常用路径以及宏变量

    我们在Linux上利用 rpmbuild 构建 rpm 安装包时,通过命令rpm --showrc 查看实现代码,另外直接通过 rpm --eval "%{macro}"来查看具体 ...

  9. OC中对象的description方法

    周所周知,我们在做项目时, 可以在类的.m文件中重写该类的对象的描述description方法: 示例: -(NSString *)description {     NSString *str = ...

最新文章

  1. C++:随笔9----模板/内联函数/容器
  2. ScalaPB(4): 通用跨系统protobuf数据,sbt设置
  3. 怎么用pycharm更新python_利用PyCharm操作Github(仓库新建、更新,代码回滚)
  4. 【Python】Python库之图形用户界面
  5. python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)
  6. Bootstrap 使用Less变量
  7. 【clickhouse】clickhouse时区
  8. UILabel小技巧
  9. java adt is保存快捷键_实用的eclipse adt 快捷键
  10. canvas drawImage() 方法绘制图片与视频
  11. 【Cadence】制作AD630焊盘SOIC_20
  12. protel 99se 简单的手动画pcb
  13. Jmeter的面试题集
  14. 2019不是闰年php代码,2019年是闰年吗,2019年有闰月吗?
  15. Android开发必备知识
  16. 刘彬20000词汇05
  17. ❤️大学三年沉淀,把我的学习经验分享给你,爆肝万字带你走进编程世界!❤️
  18. Android掌上医疗预约挂号系统app
  19. win7 查看php版本信息,window_Windows系统版本怎么看?2种查看windows版本的方法介绍,前段时间微软正式开始向Win7和 - phpStudy...
  20. 数据库(MySQL)基础

热门文章

  1. cisco 2911 GRE ***
  2. 大话云计算——认识云——“瑞友杯”虚拟化征文
  3. 【推荐】极简数独1.0源码
  4. 将frm,myi,myd文件打包成sql文件
  5. 用友软件工程IT应用研究院
  6. 以经济周期的角度来看世界
  7. procreate基本操作
  8. 本学期的选修课:动感单车
  9. [Hive_add_11] Hive 使用 UDTF 实现日志降维
  10. 算法学习之路|称量硬币(模拟)