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. vmware Centos6.6安装64位

    Centos6.6安装64位 必须开启BIOS中的虚拟化技术 首先开机进入BIOS,一般机器是按F2,我的T420是按F1,然后进入Security,Virtualization,选择Enable即可 ...

  2. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

  3. python 生成验证码

    在工作中经常遇到一些验证码,这些是怎么生成的呢,今天我用Python编写了下 import randomcode = []for i in range(6): if i == random.randi ...

  4. jsp URL中文传值

    js中,讲中文转码 encodeURI(中文): Java中,转回中文 java.net.URLDecoder.decode(乱码,"utf-8"): 例子; window.loc ...

  5. 2016总结-->生活不只有技术和代码,还有诗和远方的田野。

    生活不只有技术和代码,还有诗和远方的田野. //---------------------------技术 1.应用框架的架构----->收银系统 一般情况开发中常用activity+fragm ...

  6. [译]Object.getPrototypeOf

    原文 概要 返回指定object的prototype. 语法 Object.getPrototypeOf(object) 参数 object 要返回原型的对象. 描述 当object参数不是一个对象的 ...

  7. frame和bounds

    - frame 是一个以**父视图**为坐标系的位置- bounds 是一个以**自身**为坐标系的位置- 如果改变了bounds 那么会影响子控件的显示位置

  8. 基于ZK构建统一配置中心的方案和实践

    背景: 近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见.如果恰巧您也使用或者接触过类似的东西, 也希望您可以分享下您觉得现在这个项目可以优化和改进的地方. 项 ...

  9. Linq练习

    首先在Program.cs的Main()方法下添加如下代码: string[] names = { "heh", "haha", "huahua&qu ...

  10. 动态令牌-(OTP,HOTP,TOTP)-基本原理

    名词解释和基本介绍 OTP 是 One-Time Password的简写,表示一次性密码. HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性 ...