高级C/C++编译技术之读书笔记(一)之编译/链接

本节思维导图1.计算机体系结构抽象2.进程内存映射布局(1)代码节:供CPU执行的机器指令码(.text节)(2)数据节:供CPU操作的数据,通常来说,初始化数据(.data)、未初始化数

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

                                                                                    高级C/C++编译技术之读书笔记(一)之编译/链接

  最近有幸阅读了《高级C/C++编译技术》深受启发,该书深入浅出地讲解了构建过程(编译、链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架构设计方法,以及系统开发过程中疑难问题的解决方案。

  以下将回头记录下其中的关键要点,以便后面查阅。

本节思维导图

  高级C/C++编译技术之读书笔记(一)之编译/链接

1. 计算机体系结构抽象

  高级C/C++编译技术之读书笔记(一)之编译/链接

2. 进程内存映射布局

高级C/C++编译技术之读书笔记(一)之编译/链接

(1)代码节:供CPU执行的机器指令码(.text节)

(2)数据节:供CPU操作的数据,通常来说,初始化数据(.data)、未初始化数据(.bss)、和只读数据(.rdata)会保存在分量的节中

(3)堆:动态内存分配的区域

(4)栈:为各个函数提供独立的存储空间

(5)最上层部分属于内核区域,特定进程的环境变量就存放在该区域

3. 编译阶段

  编译的目的就是将高级语言转换为机器可以识别和执行的机器语言(汇编或二进制),主要过程包括:

(1)预处理:将#incldue关键字标识的含有定义的文件包含到源代码文件中、将#define语句指定的值抓换为常量、在代码中调用宏的位置将宏定义转换为代码、根据#if/#elif和#endif指令的位置包含或排除特定部分的代码

(2)语言分析:将代码转换为更易于处理的形式(删除注释和不必要的空格,以及从文本中提取符号等操作),检查程序是否满足编程语言的语法规则。包括词法、语法和语义分析

(3)汇编阶段

(4)优化阶段:将程序的寄存器使用率最小化,预测出实际上不需要执行的代码,并将其删除

(5)代码生成阶段

4. 链接阶段

  连接过程的输入是目标文件的集合,其中由编译阶段预先生成,每个目标文件可以被看作单个的源代码的二进制存储版本,需要为程序内存映射提供各种各样的节(代码,初始化数据,未初始化数据,调试信息等)。连接器的最终任务是将独立的节组合成最终的程序内存映射节,与此同时解析所有的引用,为不同部分的代码间建立关联,使得程序称为一个整体。

  (1)重定位:完成内存因素各行

  (2)解析引用:检测拼接到程序内存映射中的节,找出哪些部分代码产生了外部调用,计算该引用的精确地址,将机器指令中的伪地址替换成程序内存映射的实际地址

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120111.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ANDROID自己定义视图——onLayout源代码 流程 思路具体解释[通俗易懂]

    ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

    2022年1月27日
    42
  • 重建二叉树 python_Python实现重建二叉树的三种方法详解

    重建二叉树 python_Python实现重建二叉树的三种方法详解本文实例讲述了Python实现重建二叉树的三种方法。分享给大家供大家参考,具体如下:学习算法中,探寻重建二叉树的方法:用input前序遍历顺序输入字符重建前序遍历顺序字符串递归解析重建前序遍历顺序字符串堆栈解析重建如果懒得去看后面的内容,可以直接点击此处本站下载完整实例代码。思路学习算法中,python算法方面的资料相对较少,二叉树解析重建更少,只能摸着石头过河。通过不同方式遍历二叉树,可以得…

    2022年4月30日
    54
  • 263企业邮箱在foxmail上的成功设置(smtpwcom/popwcom.xxoo.com)

    263企业邮箱在foxmail上的成功设置(smtpwcom/popwcom.xxoo.com)263企业邮箱在foxmail上设置了好几天,终于成功了!长话短说,我使用的263邮箱没有以@263.com结尾的(化名@xxoo.com结尾),设置时不管使用smtp/pop.xxoo.com还是使用smtpcom/popcom.xxoo.com都没用,后来中间加个w就有用

    2022年7月17日
    37
  • Extjs grid设置单元格字体颜色,及单元格背景色

    Extjs grid设置单元格字体颜色,及单元格背景色转自:http://blog.csdn.net/suixufeng/article/details/7480170上面这种是最简单的,设定固定的某单元格中字体颜色。[javascript]viewplaincopy//————————————————–列头    var cm = new

    2022年7月11日
    88
  • java如何输入字符串_JAVA中怎样输入字符串「建议收藏」

    java如何输入字符串_JAVA中怎样输入字符串「建议收藏」https://zhidao.baidu.com/question/344967589.htmljava.lang.String.charAt()方法返回指定索引处的char值。http://www.yiibai.com/javalang/string_charat.html(toLowerCase)toUpperCase的意思是将所有的英文字符转换为大写字母,如:Stringcc=“a…

    2022年7月16日
    15
  • 监督学习型神经网络

    监督学习型神经网络兄弟姐妹们,如需转载请标明出处:http://blog.csdn.net/jiangjunshow总目录什么是监督学习?简单的回答是:判断是否是监督学习,就看输入数据是否有标签。输入数据有标签,则为有监督学习,没标签则为无监督学习。对于上面的简单回答,如果你看不懂,是正常的!下面我给出详细回答,如果你还是不明白,那么…….也是正常的。因为有些概念要被接受是需要时间的!坚持不懈地看我

    2022年5月28日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号