- 1
- 0
- 约 5页
- 2017-08-23 发布于河南
- 举报
在C和C++语言开发中,指针、内存一直是学习的重点。因为C语言作为一种偏底层的中低级语言,提供了大量的内存直接操作的方 法,这一方面使程序的灵活度最大化,同时也为bug埋下很多隐患。
因此,无论如何,我们都要对内存有一个清晰的理解。
一、对内的分配
32位操作系统支持4GB内存的连续访问,但通常把内存分为两个2GB的空间,每个进程在运行时最大可以使用2GB的私有内存(00x7FFFFFFF)。即理论上支持如下的大数组:
char szBuffer[2*1024*1024*1024];
当然,由于在实际运行时,程序还有代码段、临时变量段、动态内存申请等,实际上是不可能用到上述那么大的数组的。
至于高端的2GB内存地址(00xFFFFFFFF),操作系统一般内部保留使用,即供操作系统内核代码使用。在Windows和Linux平台上,一些动态链接库(Windows的dll,Linux的so)以及ocx控件等,由于是跨进程服务的,因此一般也在高2GB内存空间运行。
可以看到,每个进程都能看到自己的2GB内存以及系统的2GB内存,但是不同进程之间是无法彼此看到对方的。当然,操作系统在底层做了很多工作,比如磁盘上的虚拟内存交换(请看下以标题),不同的内存块动态映射等等。
二、虚拟内存
虚拟内存的基本思想是:用廉价但缓慢的磁盘来扩充快速却昂贵的内存。在一定时刻,程序实际需要使用的虚拟内存区段的内容就被载入物理内存中。当物理内存中的数据有一段时间未被使用,它们就可能被转移到硬盘中,节省下来的物理内存空间用于载入需要使用的其他数据。
在进程执行过程中,操作系统负责具体细节,使每个进程都以为自己拥有整个地址空间的独家访问权。这个幻觉是通过“虚拟内存”实现的。所有进程共享机器的物理内存,当内存使用完时就用磁盘保存数据。在进程运行时,数据在磁盘和内存之间来回移动。内存管理硬件负责把虚拟地址翻译为物理地址,并让一个进程始终运行于系统的真正内存中,应用程序员只看到虚拟地址,并不知道自己的进程在磁盘与内存之间来回切换。
从潜在的可能性上说,与进程有关的所有内存都将被系统所使用,如果该进程可能不会马上运行(可能它的优先级低,也可能是它处于睡眠状态),操作系统可以暂时取回所有分配给它的物理内存资源,将该进程的所有相关信息都备份到磁盘上。
进程只能操作位于物理内存中的页面。当进程引用一个不在物理内存中的页面时,MMU就会产生一个页错误。内存对此事做出响应,并判断该引用是否有效。如果无效,内核向进程发出一个“segmentation violation(段违规)”的信号,内核从磁盘取回该页,换入内存中,一旦页面进入内存,进程便被解锁,可以重新运行——进程本身并不知道它曾经因为页面换入事件等待了一会。
三、内存的使用
对于程序员,我们最重要的是能理解不同进程间私有内存空间的含义。C和C++的编译器把私有内存分为3块:基栈、浮动栈和堆。如下图:
(1)基栈:也叫静态存储区,这是编译器在编译期间就已经固定下来必须要使用的内存,如程序的代码段、静态变量、全局变量、const常量等。
(2)浮动栈:很多书上称为“栈”,就是程序开始运行,随着函数、对象的一段执行,函数内部变量、对象的内部成员变量开始动态占用内存,浮动栈一般都有生命周期,函数结束或者对象析构,其对应的浮动栈空间的就拆除了,这部分内容总是变来变去,内存占用也不是固定,因此叫浮动栈。
(3)堆:C和C++语言都支持动态内存申请,即程序运行期可以自由申请内存,这部分内存就是在堆空间申请的。堆位于2GB的最顶端,自上向下分配,这是避免和浮动栈混到一起,不好管理。我们用到malloc和new都是从堆空间申请的内存,new比malloc多了对象的支持,可以自动调用构造函数。另外,new创建对象,其成员变量位于堆里面。
我们来看一个例子:
const int n = 100;
void Func(void)
{
char ch = 0;
char* pBuff = (char*)malloc(10);
//…
}
这个函数如果运行,其中n由于是全局静态变量,位于基栈,ch和pBuff这两个函数内部变量,ch位于浮动栈,而pBuff指向的由malloc分配的内存区,则位于堆栈。
在内存理解上,最著名的例子就是线程启动时的参数传递。
函数启动一个线程,很多时候需要向线程传参数,但是线程是异步启动的,即很可能启动函数已经退出了,而线程函数都还没有正式开始运行,因此,绝不能用启动函数的内部变量给线程传参。道理很简单,函数的内
您可能关注的文档
- 第十章 结构体与联合体.doc
- 第十章、嵌入式计算平台续.doc
- 第十章.使用 JSON 进行数据传输.doc
- 第四册最后答案汇总.doc
- 第四季度iPad市场需求将剧增 苹果积极准备.doc
- 第四讲课堂教学信息化形式的特点(十).doc
- 第四届全国信息应用技术大赛C语言程序设计预赛试题.doc
- 第四期中国智能家居行业沙龙在京圆满落幕.doc
- 第四章 Shell的使用.doc
- 第四章 用户和用户组管理.doc
- 2025广东广州市天河区拟招聘英语实习老师1人备考题库附答案.docx
- 2025广东广州市天河区城市管理第二保洁所招聘编外工作人员4人笔试备考试卷附答案解析.docx
- 2025广东广州市越秀区流花街道办事处招聘综合事务中心辅助人员1人笔试历年题库附答案解析.docx
- 2025广东广州市花都区新雅街清初级中学招聘临聘教师1人备考历年题库带答案解析.docx
- 2025广东广州市天河区城市管理第二保洁所招聘编外工作人员4人笔试备考试卷带答案解析.docx
- 江苏省盐城市东台市三仓镇区中学2026届八年级数学第一学期期末教学质量检测试题含解析.doc
- 2025广东广州市天河区城市管理第二保洁所招聘编外工作人员4人备考题库带答案解析.docx
- 江苏省盐城市亭湖区2026届数学八上期末考试试题含解析.doc
- 安徽省蚌埠市淮上区2026届数学八年级第一学期期末达标检测模拟试题含解析.doc
- 2025广东广湛城旅游轮有限公司招聘备考历年题库附答案解析.docx
最近下载
- 分析palantir对象模型shreyas phpapp01.pptx VIP
- 班子成员之间的相互批评意见.docx VIP
- 广发宏观分析报告:居民活动收支表的构建、分析与运用.pdf VIP
- Palantir公司调研报告.pptx VIP
- 汉川XH715D立式加工中心机使用说明书.pdf VIP
- 数学丨重庆市2026届高三上学期1月康德高考模拟调研卷(一)试卷及答案.pdf VIP
- 贵州省贵阳市普通中学2022-2023学年高三上学期期末语文(解析版).docx VIP
- 化工老旧装置淘汰退出和更新改造工作方案.docx VIP
- 培智六年级生活数学期末试卷ABC卷.doc VIP
- 港口机械钢结构制造规范.pdf VIP
原创力文档

文档评论(0)