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. VirtualBox安装MS-DOS6.22(图文教程)

    最近在读一些计算机发展史之类的文献,总感觉的纸上得来终觉浅,所以打算自己装一个MS-DOS,体验一下远古的操作系统!可以google到MS-DOS的安装文件: 为什么要分成三个呢?可以看到,每个大小都 ...

  2. 利用django创建一个投票网站(五)

    创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测 ...

  3. shell脚本自动拉起启动程序

    一.我们先看看编写的shell脚本的内容,该shell的作用主要是实现监控某个程序崩溃之后就自动重启该进程. while true do procnum=` ps -ef|grep "tes ...

  4. C#基础练习

    1.冒泡排序 namespace _0 { class Program { public static int[] BubbleSort(int[] arr) { ; i < arr.Lengt ...

  5. skipping the actual organic impact moderation supplied

    The most recent running footwear design has gone out. The high cost is actually $150. Expert sports ...

  6. 使用 Weinre 调试移动网站及 PhoneGap 应用

    在 PC 端,我们可以使用 Firebug 或者 Chrome 开发人员工具方便的调试网站或者 Web 应用.但是,当我们想在移动端调试站点或者应用的时候,这些工具就派不上用场了.因此,移动开发人员都 ...

  7. 预处理指令#pragma

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...

  8. 爬取https页面遇到“SSLError: hostname 'xxx' doesn't match either of”的解决方法

    使用python requests 框架包访问https://itunes.apple.com 页面是遇到 SSLError: hostname 'itunes.apple.com' doesn't ...

  9. Linux或Unix环境利用符号链接升级Maven

    1,解压Maven到安装目录,在解压目录同一级创建刚解压目录的符号链接,命令如下: ln -s apache-maven-3.3.9 apache-maven 2,配置环境变量,这里Maven主目录环 ...

  10. windows XP上实现python2.7.5和python3.4.3共存

    windows XP上实现python2.7.5和python3.4.3共存过程记录: 1. 首先安装python2.7.5和python3.4.3,两个版本安装顺序不分前后; 2. 检查系统环境变量 ...