C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此,现在踏踏实实的回顾一下。另外希望各位博友们随时指正,不甚感激!

  前部分大概分为,1,深入编译链接。2,函数调用堆栈。3,C跟C++的区别。4,面向对象思想。。。(未完待续)

  温故而知新。  

-------------------------------------------------------------------------------------------------------------------------------------

  一,深入编译链接。

  通过c语言的学习,我们知道,代码要想成为可执行文件,要经过,预处理->编译->汇编->链接->可执行文件。当然,c++也是如此,但是现在需要更加细化一点。(详细介绍编译与链接环节)

  以。main.cpp为例

  1,预处理/预编译(不做语法检查)  main.c->main.i

  2,编译(语法检查)         main.i->mian.s       
    1),在编译过程中,不分配内存(填数据的地址都是0地址)
    2),代码优化,汇总所有的符号。    
   过程:
 源代码程序->记号(扫描器)->语法树(语法分析器)->有类型标示的语法树(语义分析器)->中间代码(源代码优化器)->目标代码(代码生成器与代码优化器)
   1,首先源代码程序被输入到扫描器(Scanner),进行词法分析:运用一种类似与有限状态机的算法将源代码的字符序列分割成一系列的记号。
   2,语法分析器将对词法分析产生的记号进行语法分析。整个分析过程采用上下文无关语法。(上下文无关语法,指语法中重写规则的形式)语法分析之后产生语法树。
   3,语义分析,由语义分析器来完成,语义分析之后,整个语法树表达式都被标示了类型。,如果有些类型需要做隐式转换,语义分析器会在语法树中插入相应的转换节点。
   4,源代码优化,将有类型标示的语法树先转化为中间代码,然后由源代码优化器优化掉简单的表达式,比如array[index]=(index + 4)*(2+6). “2+6”会直接被优化掉。
   5,目标代码生成与优化,代码生成器将中间代码转换成目标机器代码。然后由目标代码优化器后产生目标代码。
  3,汇编                
     根据平台将汇编指令转换成机器码
  4,链接(包括地址和空间的分配,符号决议和重定位等)
    1),合并所有obj文件的段,并调整段偏移和段长度,合并符号表进行“符号解析”,此时分配内存地址!   
    2),对所有global符号进行处理,对local符号不进行处理。
    关于“符号解析”,所有obj符号表中对符号引用的地方都要找到该符号定义的地方。
 
    链接的核心:符号的重定位。
    关于符号的重定位,通俗的说,就是地址修正的过程。比如:在代码中,有个全局变量var,它在目标文件A中,但是我们要在目标文件B里面访问这个全局变量,B中若有指令,movl   $0x2a,var   此指令的功能是给这个var赋值0x2a。编译目标文件B,得到这条指令  的         机器码,C705     00 00 00 00  2a 00 00 00 
       (mov指令码)      (目标地址)  (源常量)
    由于在编译目标文件B的时候,编译器并不知道变量var的目标地址,所以在编译器无法确定地址的情况下,将其目标地址置为0。假设A  和B链接后,变量var的地址确定下来是0x1000,那么链接器将会把这个指令的目标地址部分修改为0x1000。
  

    

C++开始前篇,深入编译链接的更多相关文章

  1. C++开始前篇,深入编译链接(3)

    一,COMMON块 什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小.Fortran把这种空间叫做COMMON块,当不同的 ...

  2. linux 编译,链接和加载

    1.   序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...

  3. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...

  4. webpack2 前篇

    webpack2 前篇 #webpack 前两天用了一天半时间琢磨了下webpack2,想起去年这时候,面对webpack1那样恶心的文档,前前后后搞了好几次才摸索清楚,那真是吐了. 划重点 其实we ...

  5. G++编译链接的那些事

    语言 CPP 前言   虽然 VSCodeC++ 编辑器非常受大家的欢迎,无论是大佬还是小白都说对其爱不释手...   我...用了一段时间后发现实在是麻烦,配置往往花费我大量时间.可以说真的是吃力不 ...

  6. 【原创】Linux下编译链接中常见问题总结

    前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...

  7. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  8. [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

    原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...

  9. 【C编程基础】C编译链接命令gccc

    1.gcc安装 rpm -qa|grep gcc ==>检查gcc是否安装 gcc -v ==>检查gcc版本 yum -y install gcc ==>安装gcc  2.基本语法 ...

随机推荐

  1. git: 修改commiter 信息

    Committer: root root@localhost.localdomain 您的姓名和邮件地址基于登录名和主机名进行了自动设置.请检查它们正确 与否.您可以通过下面的命令对其进行明确地设置以 ...

  2. System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题

    出错的原因: 1.虽然报的是需要安装客户端8.1.7及以上版本,实际是由于.NET账户没有访问Oracle\bin文件夹的权限 2.在 Windows Server 2003/2008 或Window ...

  3. NOIp 1109

    停课后的第一场模拟赛,应该不会怎么说今天的模拟赛,除了第一题不知道那种筛法的复杂度是$log$的没敢写,其他都挺水的.另外,第三题的数据也弱化了,建议去这里再交一遍. 贴一下AC代码,有兴趣可以参考一 ...

  4. DOG检测

    共享一个代码算了,太忙鸟,有时间在补充. function [] = dog_learn() img = imread('/Users/img/lena.png'); img = rgb2gray(i ...

  5. 一个简单的 Web 服务器 [未完成]

    最近学习C++,linux和网络编程,想做个小(mini)项目.  就去搜索引擎, 开源中国, Sourceforge上找http server的项目. 好吧,也去了知乎.    知乎上程序员氛围好, ...

  6. mysql-proxy 读写分离

    mysql-proxy 读写分离 主从复制 MySQL Replication可以将master的数据复制分布到多个slave上,然后利用slave来分担master的读压力. 读写分离 MySQL- ...

  7. 如何修改geditor的配置文件 -好像geditor没有文本格式的配置文件? 要使用dconf-editor来配置- geditor自己配置编码格式

    好像geditor没有文本格式的配置文件? 好像是通过一个程序, 叫 dconf-editor 来配置geditor的? 以前是通过gconf-editor来配置的, 但是gconf-editor的配 ...

  8. iOS 打开本地 其他应用程序(URL Types)

    iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...

  9. NetBean 8 创建EJB

    一. 介绍 百度了一下关于在NetBean开发环境里创建EJB的教程,没有找到好的例子,2天的调试过程,写下来帮助后人. EJB (Enterprise Java Bean) 是一套高扩展性的开发企业 ...

  10. 取代 Windows Search

    windows自带的搜索工具太难用了,总是在你急需的时候提示还没有建立索引,眼皮底下的文件都找不到. 1. everything 适合快速搜索文件名 优点是速度快,非常快,几乎是瞬间就建立好了索引. ...