揭秘:C++编译器的函数编译流程
http://www.cnblogs.com/zhenjing/archive/2010/10/20/1856309.html
C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍。
对于 .cpp 文件中调用的一个函数 ( 或成员函数 ), 编译器主要做了下面三件事情 :
1 名字查找 . 先在所在编译单元中可见名字实体中进行名字查找 .(1) 类成员函数优先 ( 对象所在的类 -> 基类 ). 一经找到就停止查找 . (2 )如果没有 ,在相应的名字空间中做进一步的搜索 ; (3) 如果还没有 , 会根据函数参数所在的名字空间中查找 (keoning 查找 ).
2 重载决议 . 根据所找到的名字进行重载决议 , 根据参数最匹配原则选择相应的函数 .
3 可访问性检查 . 用以确定被选中的函数是否可被调用 .
说明 :
1) 根据第一条 , 显然 , 如果类型想和非成员函数一起工作 , 那么它们应该放在同一个名字空间中 . 比如 , 一般类型的重载运算符和参数类型放在同一个头文件中/或者同一个名字空间下 .
2) 函数特化模板不参与重载决议 , 因此 , 如果想运用某个函数的特化 , 最好的方法是重载该函数 , 在实现中采用该特化来工作 .
3) 重载决议发生在可访问性检查之前 . 因此 , 如果私有函数不幸参与了重载 , 并且被选中 , 最终也会出现无法访问的编译提示 . 这常常隐含二义性 , 这样的设计本身也不合理 . 换句话说 , 私有参数 , 在名字查找和重载时并非是 ” 私有的 ”.
以 c.Twice( 21 )的函数调用为例:
a) 名字查找:编译器会首先寻找一个至少包含一个名字为 Twice 的实体作用域(类,文件,或者名字空间),并将候选函数放入候选实体列表。例子中,编译器首先从对象 c 所在类实体中进行查找,找到就停止;如果没找到就会依次在其基类和外围的名字空间中查找,直到找到一个至少含有一个候选函数的作用域。两点需要注意: 1) 只要找到一个实体就停止查找,所以并非所有的同名函数都会被考虑; 2) 参数所在名字空间也属于查找范围(keoning 准则) 。
b) 重载决议:从所找到的候选重载函数列表中选出唯一最佳匹配 。如不唯一,就存在二义性。注意: 1) 这是基于名字查找结果的; 2) 特化的模板函数不参与重载。
c) 可访问性检查:确定所选出的函数是否可访问。这是最后一步,晚于重载决议。
文章中的规则非常重要,理解后,很多C++的编译问题就自然解决了。后面将会有进一步的文章来介绍:如何确定C++每个编译单元(CPP文件)中的可见名字(与名字查找相关);Keoning查找详解; 重载 (Overload) 和虚函数的重实现 (override).
揭秘:C++编译器的函数编译流程的更多相关文章
- Gcc的编译流程分为了四个步骤:
http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...
- C/C++程序编译流程(预处理->编译->汇编->链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...
- [uboot] (第四章)uboot流程——uboot编译流程
http://blog.csdn.net/ooonebook/article/details/53000893 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- [uboot] (第二章)uboot流程——uboot-spl编译流程
http://blog.csdn.net/ooonebook/article/details/52949584 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- GCC编译流程浅析
GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...
- GCC 编译流程简介
GCC-GCC编译流程 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套 ...
- [uboot] (第四章)uboot流程——uboot编译流程 (转)
以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(B ...
- [uboot] (第二章)uboot流程——uboot-spl编译流程(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...
- [Erlang 0113] Elixir 编译流程梳理
注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效 之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...
随机推荐
- javascript图形动画设计--以简单正弦波轨迹移动
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- shell 10个好习惯
The Linux Cookbook 一书的作者 Michael Stutz 凭借自己多年使用 UNIX 的经验,总结了 10 个良好习惯,个人认为真的很受用,现摘要如下与大家分享. 1.建立层级目录 ...
- SQL Serever学习6——数据表
数据表 表的构成 数据库中的基本表由记录(行)和字段(列)构成,SQLServer2008每个表可以有1024个列,每个列可以有8060字节(不包括iamge,ntext,text类型). 记录(Re ...
- 清空控件的TeXt属性
foreach (Control item in groupBox1.Controls) { if (item is TextBox) //判断控件是不是TextBox { item.Text = & ...
- 一、hive安装(内置数据库derby)
hive是一个数据仓库工具,建立在hadoop之上,它的存在是为了让大数据的查询和分析更加的方便.hive提供简单的sql查询功能,并最终转换为mapreduce任务执行. 一.环境 JDK1.8+官 ...
- bootstrap Table的使用方法
1.官网 url:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 文档包含了表格属性.列属性.事件.方法等等. 2.引入库 只 ...
- drupal读取mysql的longblob字段
unserialize($event->variables)
- laravel之路由汇总
- 新手嘛,先学习下 Vue2.0 新手入门 — 从环境搭建到发布
Vue2.0 新手入门 — 从环境搭建到发布 转自:http://www.runoob.com/w3cnote/vue2-start-coding.html 具体文章详细就不搬了,步骤可过去看,我这就 ...
- BubblePopupWindow
Android 实现各个方向的气泡弹窗,可控制气泡尖角偏移量. https://github.com/smuyyh/BubblePopupWindow 截图 使用: BubblePopupWindow ...