C++工作笔记-编译时类型检查与运行时类型检查
转载链接如下:
https://blog.csdn.net/u013298353/article/details/17676959
编译时
编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)
那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.
运行时
所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.
举例说明
可能光讲概念你还是迷糊.还分别用C++和C#来举个简单点的例子.数组越界检查的例子(开发工具用的微软的VS)
C++中
int arr[] = {1,2,3};
int result = arr[4];
cout<<result<<endl;
上面的代码你一瞧你知道是错误的代码,数组越界了.但用编译器一编译,一点错都没.可见编译器其实还是挺笨的,还没你脑瓜子那么聪明啊.然后开始运行,Start Dubugging.于是报错了,于是你想虽然编译器笨了点,但运行起来时发现了错误也还不算太坏.但实际上运行时做数组的越界检查不是C++里面支持的特性,这里你dubug是VS中的一些工具给你做的检查.你如果点运行时选的是release而不是dubug的话会发现一切正常运行,但得到的结果不确定的.(因为你不知道arr[4]所指的内存里具有有啥数据.反正所以东东在内存中都是0101串嘛,你找到连续4个字节的一串0101来然后当成int数据处理.)我一运行得到个吓人的数字,数了下貌似是十亿多.要是银行计算我的账户中有多少钱时也这样来个数组越界,搞个十多亿那我可发了啊.哎显然是想多了,还是老实敲代码吧.
C#中
int[] arr = { 1, 2, 3 };
int result = arr[4];
Console.WriteLine(result);
一编译还是正常通过.但一运行就报错了啊.C#与C++中不同,它有与运行时类型检查.会检查数组是否越界不.如果越界了不会给你返回个错误的结果,而是直接报错.你如果没有异常处理语句处理的话整个软件就挂掉了啊.
为啥C++不在运行时做数组越界检查呢?
这应该主要是考虑到性能问题吧.C++设计之初为了达到与C差不多的效率.就尽量不会在运行时多做些额外的检查.因为这样无疑会降低性能的. 但有些地方却是必须得做运行时类型检查的.比如多态,你不在运行时做类型检查就没法搞定啊.举个简单例子吧.假如有父类Father,继承自Father的子类Son.这两个类中都有虚函数Fun.
Father fa;
Son so;
fa = so;
fa.Fun(); //在编译时,实际上是把Fun当作Father类中的Fun看待.
//但在运行时实际上这里的Fun是调用的Son中的函数Fun.所以不做运行时类型检查是没法确定的啊.
C++工作笔记-编译时类型检查与运行时类型检查相关推荐
- 2022Java学习笔记七十三(异常处理:运行时异常、编译时异常、异常的默认处理的流程)
2022Java学习笔记七十三(异常处理:运行时异常.编译时异常.异常的默认处理的流程) 一.异常体系 1.Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题 2.R ...
- Java检查异常、非检查异常、运行时异常、非运行时异常的区别
Java检查异常.非检查异常.运行时异常.非运行时异常的区别 参考文章: (1)Java检查异常.非检查异常.运行时异常.非运行时异常的区别 (2)https://www.cnblogs.com/ou ...
- 【C++】5.1 编译时的多态性与运行时的多态性
5.1 编译时的多态性与运行时的多态性 1.什么时多态性 [定义] (1)在面向对象方法中,不同对象收到相同的消息时,产生不同的行为(即方法) (2)在C++程序设计中,多态性是指用一个名字定义不同的 ...
- java运行时异常的特点是什么_Java运行时异常和非运行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...
- Java运行时异常和非运行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...
- 运行时异常和非运行时异常
[强制]Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理,比如:NullPointerException,IndexOutOfBou ...
- Java基础——运行时异常和非运行时异常
文章目录 Java中异常机制的体系结构 Error(错误) Exception(异常) 运行时异常和非运行时异常的区别 结束 Java中异常机制的体系结构 在Java中,万物皆对象,异常也不例外. E ...
- Java 运行时异常和非运行时异常
异常类型分为两类:运行时异常和非运行时异常. 一.运行时异常: 运行时异常(RuntimeException),一般不需要程序员进行捕获. 例如:NullPointException,IndexOut ...
- Android RuntimePermissions运行时权限:单个运行时权限申请简例
Android RuntimePermissions运行时权限:单个运行时权限申请简例 Android运行时权限申请的框架结构和步骤比较简单和固定,一般现状代码启动后检查当前的Android SDK版 ...
- 运行时异常与非运行时异常有什么区别?
运行时异常与非运行时异常有什么区别? 运行时异常 RuntimeException 又称为非检查异常 uncheck exception.是 Exception 的子类. 在 Java 中,异常可以分 ...
最新文章
- python数字计算公式_Python中数字以及算数运算符的相关使用
- 从实习被劝退,到收获阿里腾讯的offer,谈谈读研给我带来的转变
- python3编译caffe错误:cannot find -lboost_python3
- Flex AdvancedDataGrid 数据展示异常
- [uEnv.txt]在uEnv.txt文件中使用if语句实现Image/dtb文件切换
- Math,random()返回区间内的随机数
- Intellij IDEA 使用学习
- 【渝粤教育】国家开放大学2018年春季 0176-22T电机学(一) 参考试题
- 前端学习(2981):Json格式转换
- javascript字符串相关的面试题总结
- (71)FPGA面试题-使用不同的代码实现2-4译码器?使用case语句
- while循环random结合_Java 经典算法:二分法查找(循环和递归两种方式实现)
- Daily Scrum02 12.03
- FastDFS-单机版安装
- 【转】惹恼程序员的十件事
- python真好玩 pdf 下载_Python真好玩:教孩子学编程_PDF电子书
- 简练网软考知识点整理-项目配置管理计划
- 2021年MEMS传感器产业链变化与趋势
- java font好看的字体_二十款漂亮的CSS字体样式
- Android 图片查看器选择器 PictureSelector
热门文章
- 如何批量查问PR值、百度权重、百度快照及收录量,用BlueCatTools批量网站查询工具
- 飞鸽传书有关举证不够严谨
- 来前端君朋友圈,一起聊前端面试技巧
- 第三节:ES6中另一个不得不说的关键字const
- badboy设置中文_[转载]Badboy使用教程
- android.support.v7.widget.,关于android.support.v7.widget.RecyclerView的使用,总是找不到类...
- matlab对多项式求导,matlab中多项式求导
- 机器学习笔记十一之降维
- 关注 | 新冠病毒这次的突变毒株太可怕,与人受体亲和力提高了1000倍,传播提高70%!已经成为伦敦地区主要毒株...
- R统计和作图文章汇总