按照老版操作系统来学习,内存对于程序来讲分四区。分别是 代码区,静态区,栈,堆。

由上面程序执行的结果可知:

貌似结果就是 静态代码堆栈

静态区存放的是程序中所有静态变量和常量的值。静态区的大小是程序加载到内存之后就固定的,不会再发生改变。

代码区中存放的是程序中的代码,不能修改它的值,只能通过指针或者变量名来使用函数。【当然强行修改是被允许的但是可能发生未知错误。】

堆是一块很大的区域,通常情况下是4G的大小,(这个数字通常情况下是虚拟的,但是可以利用现代操作系统来利用硬盘模拟出来这么一块儿空间,因为我们随便开几个程序这就一下把内存撑死了。所以这个 4G是一个虚拟的情况,我们编程的时候就考虑这是一个4G的很大空间就可以了,然后 要记得自己分配的空间及时还回去。)

栈,栈对于不同的操作系统来讲,其大小不固定,有大有小,通常情况下在4k或者8k左右,64k就顶天了。但是 不同的是:栈对于一个线程来讲,就有一个栈,如果一个进程有4个线程,那么这个 线程区域就有4个栈。

对于整个分配过程来讲,可以看到我们是从地址的高位开始往下分配了静态区域,代码区域,堆,栈,所以可以想见:对于里面的每一个东西来讲,分配都是从上到下的

根据这个结果来分析一下对于内存的分配关系:

堆这里不太敢说,但是对于栈来讲,先进后出,从下面入,下面出。

并且它的释放是按照,代码块儿的形式释放的,按照取地址的方式取得具体的某一个数字的值的。

我们的验证结果跟这个图还是基本一致的,除了 静态区和代码区多少有点出入以外。栈的上面是栈底,我们一行一行往里面写数据,然后在释放数据。堆里面不断地开辟空间,进行使用。想到了之前我们说的。在windows里面内存使用的大端对齐,拿我们的程序的高位对内存的低位。而对于某些大型服务器的系统来讲,是小端对齐。拿程序的低位对应内存的低位。

既然知道了内存的分配,那么希望我们所写的代码尽量少的使用内存。

所以在编程的时候:这样写:Char[9].总感觉比Char[10]要省一个字节。那么真的如此么?

于是跑了一段这样的代码:

我的系统得到的结果是每次都会增加4k。

按照视频的讲解的思路就是:当我们的程序在malloc的时候,都会开辟32k大小的一块空间,每32k上面有4k大小的内存页,我们申请了一段内存,就先可着头一个4k大小的内存页使,当用完当前这个内存页之后,从32k的空间上拿走下一个4k的内存页,直到当前的32k被用完,此时,去向操作系统申请下一块32k大小的内存。如此循环,所以本质上我们这个要走的多少一个字节,反而有点儿没有必要。反而更重要的点在于用完了要及时把我们malloc的堆及时得free掉。比较靠谱。

C语言内存四区的更多相关文章

  1. C语言内存四区的学习总结(一)---- 静态区

    最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...

  2. C语言内存四区的学习总结(三)---- 栈区

    接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...

  3. C语言内存四区的学习总结(二)---- 堆区

    接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...

  4. c语言内存四区、数据存储范围和内存存储方向

    (1)代码区通常是共享只读(代码无法修改)的,即可以被其他的程序调用,例如运行两个qq,除了数据不一样,代码都是一样的, 每次运行qq,都会将代码和数据加载到内存中,除了数据,每次加载的代码都是一样的 ...

  5. C语言提高 (1) 第一天 数据类型本质与内存四区

    (物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...

  6. 深入理解C语言-深入理解内存四区

    数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...

  7. C语言进阶之路(一)----C语言的内存四区模型

    内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...

  8. C语言之内存四区模型和函数调用模型

      内存四区模型 流程说明1.操作系统把物理硬盘代码load到内存2.操作系统把c代码分成四个区3.操作系统找到main函数入口执行 1.内存四区: 一个由c/C++编译的程序占用的内存分为以下几个部 ...

  9. C语言的内存四区模型和函数调用模型

    首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...

随机推荐

  1. MEF技术

    MEF 是一个使开发人员能够创建“插件式应用程序”的技术,这里的“插件”是指在应用程序部署后开发人员能够通过开发“插件”来扩展应用程序功能.但不同之处是使用MEF框架您在系统设计阶段不需要考虑在应用程 ...

  2. C语言断言

    1.概述 断言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),它可以快速发现并定位软件问题,同时对系统错误进行自动报警.断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位 ...

  3. 怎么限制Google自动调整字体大小

    Google默认的字体大小是12px,当样式表中font-size<12px时,或者没有明确指定字体大小,则在chrome浏览器里字体显示是12px. 最近在写代码玩的时候,我也碰到了 在FF和 ...

  4. Solaris10下Telnet、SSH、ftp使用root登录

    学习solaris过程中,使用SecureCRT.putty等工具用root账号登录,总是登录不上去,后来经老师解答和网上找答案,发现是 solaris默认是不可以远程使用root账号登录的,如果想开 ...

  5. win7 开wifi热点

    开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费. 1.启用并设定虚拟WiFi网卡: 运行命令:nets ...

  6. Android--应用开发3(Android layout XML属性)

    Android layout XML属性 转载:http://www.cnblogs.com/playing/archive/2011/04/07/2008620.html Layout对于迅速的搭建 ...

  7. CA1060

    Move P/Invokes to NativeMethods class 规则描述: 平台调用服务访问非托管代码. 平台调用方法(使用了System.Runtime.InteropServices. ...

  8. hdfs里的文件下载HDFS之fsimage、metadata、edits、fstime(二十七)

    首先,要有这个观念,元数据信息(fsimage + editslog). fsimage是在磁盘 metadata是在内存 ********************fsimage把内存的,序列化到磁盘 ...

  9. poj 4045 (树形DP)

    先选一点为根节点找出所有父节点i到下面所有点距离和dp[i],该父节点下面有多少个点Node[i]. 然后求出所有节点的所有非子节点到该点的距离dp1[v]+=(dp1[u]+(dp[u]-dp[v] ...

  10. React-native 中的触摸响应功能

    我们在做APP的时候,与桌面应用系统不同的是触摸响应. web页面对触摸响应的支持和原生的APP有着很大的差异. 基本用法 componentWillMount: function() { this. ...