面试必备的C++知识(未完待续)
文章目录
- C++ 内存管理
- code segment/text segment:.TEXT
- Initialized Data Segment:.DATA
- Uninitialized Data Segment:.BSS
- stack
- heap
- C++ static
C++ 内存管理
图示如下:
code segment/text segment:.TEXT
文本段,也称为代码段或简称为文本段,是目标文件或内存中包含可执行指令的程序的一部分。
text段不仅包含函数,还有常量。
作为存储区域,文本段可以放置在堆或堆栈下方,以防止堆和堆栈溢出覆盖它。
Initialized Data Segment:.DATA
初始化数据段,通常简称为数据段。数据段是程序的虚拟地址空间的一部分,其包含由程序员初始化的全局变量和静态变量。
请注意,数据段不是只读的,因为变量的值可以在运行时更改。
该段可以进一步分类为初始化的只读区域和初始化的读写区域。
Uninitialized Data Segment:.BSS
未初始化的数据段,通常称为“bss”段,意思是“block started by symbol”。
此段中的数据在程序启动之前由内核初始化为0。
未初始化的数据从数据段的末尾开始,包含初始化为零或在源代码中没有显式初始化的所有全局变量和静态变量。
例如,变量声明为static int i; 将包含在BSS部分中。
例如,一个声明为int j的全局变量; 将包含在BSS部分中。
stack
栈:函数中的局部变量存在栈上,在函数结束后自动释放空间。栈空间比较有限。
heap
堆:堆是new class存放的地方,需要我们手动delete进行空间的释放。
堆区域从BSS段的末尾开始,并从那里增长到更大的地址。堆区域由malloc,realloc和free管理,可以使用brk和sbrk系统调用来调整其大小(注意使用brk / sbrk和单个“堆区域”不需要履行malloc / realloc / free的合同;它们也可以使用mmap实现,以将可能不连续的虚拟内存区域保留到进程的“虚拟地址空间”中。堆区域由进程中的所有共享库和动态加载的模块共享。
堆栈区别与优缺点:
1.栈中变量有程序自动管理,堆中变量由程序员手动释放。
2.栈的空间有限,堆的空间非常大。
参考:Memory Layout of C Programs - GeeksforGeeks
C++ static
对于函数中的变量,当我们在变量前加上static时,就是告诉了编译器将该变量放入静态数据区。函数退出时不会将该变量析构掉,当我们下次再调用改函数依然可以取得内存中的这个变量。
static 对于函数于变量其实比较类似,它限定了函数只能在当前的模块中使用。
对于全局变量,加上 static 关键字后该变量只能用于当前的文件。
全局变量和加上 static的全局变量都存放在静态数据区。
静态数据区有 .bss 和 .data。.bss 在编译时实际上不占据空间,只有在运行时才会由被分配空间。没初始化的全局变量存放在.bss段,初始化赋值的全局变量存放在.data段,对于初始化为0的全局变量,依然存放在.bss段。
new的过程。operator new->空间配置器->malloc->glibc的malloc/tcmalloc->brk/sbrk/mmap->new operator。问sbrk分配了内存空间吗?没有,只是在进程范围内提供虚拟内存合法访问地址。要mmu映射,缺页中断,物理内存分配。说了一下伙伴算法。
参考:
- C/C++内存管理详解 | ShinChan’s Blog
- C++ 面试之 static 关键字
面试必备的C++知识(未完待续)相关推荐
- 软件开发者的常用工具(含Visual Studio必备插件)【未完待续】
目录 编程工具 Visual_Assist(小番茄) Resharper ImageWatch GDB_ImageWatch qt-vsaddin-msvc2013-2.3.2 AnkhSvn-2.5 ...
- 程序员对Windows环境下计算器的必备技巧总结(未完待续...)
文章目录 入门使用 指数运算 科学计算器 指数运算 进制转换 认识界面 进制转换 入门使用 win + r打开运行窗口,输入calc进入计算机面板 指数运算 科学计算器 右侧 -- 科学型计算机 指数 ...
- 基础数学知识(未完待续)
0x10 质数 质数基本定理 质数的定义:只被 1 1 1 和它本身整除的正整数叫做质数.非质数的正整数叫做合数.特别的, 1 1 1 既不是质数也不是合数. 质数的数量很少. 只有 2 2 2 是偶 ...
- 二叉树学习笔记(未完待续)
摘要 二叉树学习笔记(未完待续). 博客 IT老兵驿站. 前言 昨天(2019-11-07)复习红黑树,发现红黑树和二叉树密不可分,所以这里再复习一下二叉树. 在大学的时候,这块我很认真地学习了一遍. ...
- 程序人生(创)一个新手程序员的两三事(未完待续...)
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/53375654 本篇博文同时在论坛连载:http://bbs.csdn.net/topi ...
- 黑马程序员—离开黑马,一切都并未结束,我们的故事,未完待续--------
文章来源:黑马程序员,黑马论坛 今天又收到一位同学工作后发来的信.公开以勉励后来者. --------------------------------------------------------- ...
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...
- pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)
1. SRCNN 1.1. Contribution end-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 ). 指出了超分辨方向上传统方法( spar ...
- 学完oracle 再学mysql_一篇文章让Oracle程序猿学会MySql【未完待续】
一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...
- 省钱版----查找 IoT 设备TTL线序__未完待续
作者:仙果 原文来自:省钱版--查找 IoT 设备TTL线序 省钱版----查找 IoT 设备TTL线序__未完待续 缘由 在IoT固件调试分析的过程中,建议首先在IoT设备的板子上焊接调试线,这是能 ...
最新文章
- Java中合成与继承的选择
- 【C/C++】变量做数组长度
- 使用Diskpart建立GPT磁盘分区图文教程
- 在WPF中处理Windows消息
- jzoj1164-求和【欧拉函数,数论】(筛欧拉函数模板)
- AD中如何查看快捷键
- 数据结构_C语言_实验一_线性结构 ——一元多项式求导
- java子类继承父类变量_JAVA子类继承父类
- 笔记本可以连wifi,但很卡或者无法访问互联网的一种解决方法
- scrapy重试机制_Scrapy项目之User timeout caused connection failure(异常记录)
- 安卓手机管理_北斗ERP进销存管理(销存管理工具)V2.2.4 安卓手机版
- ddr3和ddr4区别
- 概率论与数理统计 第一周作业
- putty 的下载,免费分享
- 硬盘健康度检测linux,linux硬盘检测健康状态
- 计算机在职研究生学什么时候,2020年计算机在职研究生学制为几年?
- 整理 H5 meta 标签的详解
- java南方八字排盘_八字排盘示例代码
- 总结2012年伦敦奥运会的八大IT经验教训
- Springcloud-config连接gitee报404,Cannot clone or checkout repository: https://gitee.com/**
热门文章
- Scanpy(三)可视化函数
- 第十二课.统计推断的基本思想
- AEM:众里寻他千百度,用了SIP不迷路-识别污水处理单元中砷氧化细菌的多样性及代谢潜力...
- 【不容错过】12月10日:纳米孔测序科研团队大会NCM 2020亚太区特别专场
- 最后一周 | 微生物组-宏基因组分析第8期(报名直播课免费参加线下2020.7)
- 微生物组-扩增子16S分析研讨会(2020.1)
- 东北黑土区不同纬度农田土壤真菌分子生态网络的比较
- 生物信息9天速成班—成为团队中不可或缺的人
- Microbiome:HiSeq平台16S扩增子超高通量测序文库构建方法
- Python使用matplotlib可视化安德鲁斯曲线、安德鲁斯曲线可以用来查看分类变量对于数据集是否具有判别性、区分性(Andrews Curve)