C++ part6

C++源文件从文本到可执行文件经历的过程

references:
一个C++源文件从文本到可执行文件经历的过程

C++源文件从文本到可执行文件经历的过程
gcc程序编译的静态链接和动态链接

保留中间过程文件:a.i, a.s, a.o, a.out
g++ a.cpp -save-temps

?

1、预处理阶段:

对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,成预编译文件。

  • 处理“#include”预编译指令,将文件内容替换到它的位置
  • 展开宏定义
  • #ifndef作用
  • 删除注释
  • 等等

    g++ -E a.cpp -o a.i

2、编译阶段

将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件

g++ a.cpp -S

3、汇编阶段

将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件

g++ -c a.s -o a.o

4、链接阶段

将多个目标文件及所需要的库连接成最终的可执行文件。链接分为静态链接和动态链接。

  • 静态链接:链接器将需要使用的库函数的一份拷贝加入到可执行文件中。优点是简单,速度快;缺点是空间耗费大,函数更新后就要重新编译链接可执行文件。
  • 动态链接:可执行文件只是包含了文件名,运行时才把他们链接到一起。优点是可执行文件体积小,更新方便;缺点是运行速度慢。

    g++ a.o -o a //动态链接
    g++ a.o -static -o a //静态链接

include头文件的顺序

如果a.h中定义了b.h中声明的变量并且a.h没有引用b.h,那么引用a.h前要先引用b.h。
当然这是显然的。

include双引号””和尖括号<>的区别

预处理阶段查找头文件的路径不一样。

  1. 双引号:
    编译器从用户工作目录开始,再找系统默认目录。
  2. 尖括号:
    编译器只找系统默认目录。

malloc原理

references:
nowcoder

malloc底层原理实现

malloc采用内存池,申请大块内存作为堆区,将堆区分成多个内存块进行管理。用一个(隐式)空闲链表将空闲块连在一起,每个空闲块存了一个连续的、未分配的地址。

在内存分配时,malloc会通过空闲链表遍历查找符合大小的块,然后把空闲块分成两个块,一个变成分配块,一个变成新的空闲块;在内存合并时,malloc用边界标记法,根据前后块是否分配进行合并。(减少内存碎片)

brk调用和mmap调用虚拟内存

references:
内存分配系统调用:brk和mmap

请问malloc的分配为什么是小内存用brk,大内存用mmap,各自有什么好处?
Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同

实现虚拟内存到内存的映射

申请内存小于128K的时候,使用brk系统在堆区分配;大于128K的时候,使用mmap在映射区分配。
原因:
brk指针只有一个,分配内存时是把进程堆的最高地址往高地址上推,只有高地址释放后才能释放低地址内存,如果大内存用brk分配会产生内存碎片。
mmap分配内存可以单独释放,但是分配小内存使得缺页中断次数增加,性能下降。

内存泄漏

references:
nowcoder

1、堆内存泄漏:new/malloc之后没有deete/free,申请的内存没有释放。
2、系统资源泄漏:主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

如何判断内存泄漏

references:
Q28:如何判断内存泄漏

使用Linux环境下的内存泄漏检查工具Valgrind。

段错误

访问非法内存地址(数组访问越界等),访问只读的内存地址(字符串常量等),栈溢出。

C++ STL 的内存优化

references:
C++ STL中的内存优化

采用两级配置器结构:

一级配置器

申请空间大于128byte,使用一级配置器。包含malloc()、remalloc()、free()等C函数执行实际的内存配置,释放,重新配置等操作。

二级配置器

分配小于128字节内存时,以内存池进行管理。
内存池每次配置一块内存,并维护对应的16个空闲链表(free-list),每个节点分别管理大小为为8,16,24,32,……,120,128的数据块。
向二级配置器申请时,将申请内存扩大到8的倍数,去找空闲链表对应的位置,然后找子链表。子链表不为空,就分配链表头表示的内存,表头指向下一个节点;为空则向内存池申请(一般一次20块),分配到子链表中,再把链表头分配出去。

作用:在STL的第二级配置器中多了一些机制,避免太多小区块造成的内存碎片,小区块造成的不仅仅是内存碎片,同时还有一些额外的负担。区块越小,额外的负担所占的比重越大。

原文地址:https://www.cnblogs.com/KirinSB/p/12521159.html

时间: 2024-08-08 17:54:34

C++ part6的相关文章

《数字图像处理原理与实践(MATLAB版)》一书之代码Part6

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part6,辑录该书第281至第374页之代码,供有需要读者下载研究使用.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 P338 i=double(imread('vase.tif'));[C,S]=wavedec2(i,2,

Python重写C语言程序100例--Part6

''' [程序41] 题目:学习static定义静态变量的用法 1.程序分析: 2.程序源代码: ''' # python没有这个功能了,只能这样了:) def varfunc(): var = 0 print 'var = %d' % var var += 1 if __name__ == '__main__': for i in range(3): varfunc() # attribut of class # 作为类的一个属性吧 class Static: StaticVar = 5 de

MMORGP大型游戏设计与开发(客户端架构 part6 of vegine)

客户端的变量模块部分主要是将一些常用可变的值集中管理,如窗口的大小,是否开启音乐,音量的大小等等.这些变量通常会应该到客户端的操作,一般来说变量改变的时候会调用一个回调进行处理.下面我们就看看该模块的常用方法吧. CODE 文件system.h /** * PAP Engine ( -- ) * $Id system.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2014 viti

The Ionic Book - Part6 发布你的应用

原文地址:http://ionicframework.com/docs/guide/publishing.html 请尊重他人劳动成果,转载请注明出处, 谢谢 前一篇:The Ionic Book - Part5 完善你的应用 现在我们有了一个能够运行的应用,我们已经准备好将它推向真实的世界了!因为Ionic的创始人Drifty已经将这个教程中的Todo应用提交到了app store,你可以跟随这个部分来提交你自己的应用. 首先我们需要为我们的应用发布一个版本,目标是我们想要部署的每种平台.在我

Asp.Net MVC part6 WebAPI

两种web服务SOAP风格:基于方法,产品是WebServiceREST风格:基于资源,产品是WebAPI可以返回json.xml类型的数据对于数据的增.删.改.查,提供相对的资源操作,按照请求的类型进行相应处理,主要包括Get(查).Post(增).Put(改).Delete(删),这些都是http协议支持的请求方式请求方式:根据路由规则请求 在APIController中定义crud的方法,名称可以自定义,如果对应相应的资源操作,可以使用特性约束主要的特性包括HttpGetHttpPostH

图形管线之旅 Part6

原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑 转载请注明出处 欢迎回来.这次我们去看看三角形的光栅化.但在光栅化三角形之前,我们需要执行三角形设置,并且在设置三角形之前,我还要解释一下为了什么做的准备,我们来聊聊三角形硬件光栅化算法. 如何画一个三角形 首先,给很熟悉这部分并自己写过优化的软纹理映射的人一点小提示:三角形光栅器一次要处理一堆东西:跟踪三角形的形状,插值出坐标u和v(对于透视矫正映射,是u/z,v/z和1/z),执行

实战Django:Rango Part6

24.优化模板 在这个项目中,从已经做过的模板来看,你可能会注意到里面有很多重复的代码.这种重复不仅带来大量无谓的工作量,而且以后调整起来也极为不便. 因此,最理想的做法是将那些重复的代码放到基础模板中,然后从基础模板再扩展出一个个新的模板. 我们先来做这个基础模板,在templates/rango文件夹下新建一个base.html文件,然后添加以下内容: templates/rango/base.html: <!DOCTYPE html> <html> <head>

MMORPG大型游戏设计与开发(part6 of net)

上一部分,讲述了一个服务器与服务器之间的通信实例,客户端其实原理大同小异.网络部分准备就暂时讲到这里,不过我们不妨再回头过来想想在这过程中有没有优化和改进的地方.这部分讲解的是以网络包代码作分析,实现自动生成其代码的功能. 网络包代码 /** * PAP Engine ( -- ) * $Id connect.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2013 viticm(

Ka的回溯编程练习 Part6|有重复元素的排列问题

第一个问题: 有红球4个,白球3个,黄球3个,将它们排成一排共有多少种排法 #include <stdio.h> int BallsIUsed[201]; int BallsIHave[201]={0}; int total=0; int k; void op() { int i; total++; printf("%d:",total); for(i=1;i<=k;i++) { printf("%c",BallsIUsed[i]); } prin

实战Django:官方实例Part6

我们终于迎来了官方实例的最后一个Part.在这一节中,舍得要向大家介绍Django的静态文件管理. 现在,我们要往这个投票应用里面添加一个CSS样式表和一张图片. 一个完整的网页文件,除了html文档外,通常还需要其它一些文件,比如图片.JS或者CSS,这些文件,我们称之为"静态文件". 在那些小项目中,我们不需要对静态文件关注太多,因为你可以将这些文件随便放置,只要你的服务器能查找得到就好.但在大一点的项目中,尤其是那些拥有好多个应用的项目,静态文件的管理便变得非常重要,所以骚年,还