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. 用Redis实现分布式锁

    Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists.这系列的命令非常有用,这里讲使用SETNX来实现分布式锁 ...

  2. Java开发实践 集合框架 全面分析

    http://www.open-open.com/lib/view/open1474167415464.html

  3. github教程

    http://www.yangzhiping.com/tech/github.html

  4. MySQL性能调优my.cnf详解

    [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir  ...

  5. 使用sublime一键格式化XML文件

    1 sublime简介 sublime是一款代码编辑和阅读软件,体积小,运行快,界面非常简洁漂亮.官方地址:https://www.sublimetext.com/ 2 在sublime上安装插件 使 ...

  6. Android中AIDL的理解与使用(一)——跨应用启动/绑定Service

    AIDL(Android Interface Definition Language)--安卓接口定义语言 一.startService/stopService 1.同一个应用程序启动Service: ...

  7. 关于struts2的过滤器和mybatis的插件的分析

    网上一搜,发现一篇写的非常棒的博文,就直接复制过来了,供以后复习使用. 前辈博文链接:共三篇: http://jimgreat.iteye.com/blog/1616671: http://jimgr ...

  8. C# 深入浅出 异步(八)

    C#异步调用学习链接:从C#5.0说起:再次总结C#异步调用方法发展史

  9. fzf by ruby

    fzf by ruby */--> fzf by ruby 1 github地址 https://github.com/junegunn/fzf 2 简介 软件通过匿名管道和grep扩展了bas ...

  10. linux 正则表达式使用

    1.正则表达式概念 正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 正则表达式的基本元素包括普通字符和元字 ...