C语言内存四区
按照老版操作系统来学习,内存对于程序来讲分四区。分别是 代码区,静态区,栈,堆。
由上面程序执行的结果可知:
貌似结果就是 静态代码堆栈
静态区存放的是程序中所有静态变量和常量的值。静态区的大小是程序加载到内存之后就固定的,不会再发生改变。
代码区中存放的是程序中的代码,不能修改它的值,只能通过指针或者变量名来使用函数。【当然强行修改是被允许的但是可能发生未知错误。】
堆是一块很大的区域,通常情况下是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语言内存四区的更多相关文章
- C语言内存四区的学习总结(一)---- 静态区
最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...
- C语言内存四区的学习总结(三)---- 栈区
接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...
- C语言内存四区的学习总结(二)---- 堆区
接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...
- c语言内存四区、数据存储范围和内存存储方向
(1)代码区通常是共享只读(代码无法修改)的,即可以被其他的程序调用,例如运行两个qq,除了数据不一样,代码都是一样的, 每次运行qq,都会将代码和数据加载到内存中,除了数据,每次加载的代码都是一样的 ...
- C语言提高 (1) 第一天 数据类型本质与内存四区
(物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...
- 深入理解C语言-深入理解内存四区
数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...
- C语言进阶之路(一)----C语言的内存四区模型
内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...
- C语言之内存四区模型和函数调用模型
内存四区模型 流程说明1.操作系统把物理硬盘代码load到内存2.操作系统把c代码分成四个区3.操作系统找到main函数入口执行 1.内存四区: 一个由c/C++编译的程序占用的内存分为以下几个部 ...
- C语言的内存四区模型和函数调用模型
首先是操作系统将代码程序加载到内存中 然后将内存分为4个区 栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放. 堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构. ...
随机推荐
- mycat分布式mysql中间件(数据库切分概述)[转]
mysql数据库切分 前言 通 过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时 候,我们还是会面临到扩展 ...
- 工作流设计 zt
工作流设计 业务流程管理模块是本平台的重要组成部分,要实现将已经发布的标准中规范化的流程转化为具体计算机中的流程从而实现流程的自动运转,将标准化成果与员工的日常工作紧密结合起来,具有重要意义. 业务流 ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...
- Zabbix探索:网络设备监控1
近期需要大量添加网络设备,为了避免以后在节点100上出现问题,所以特地申请了一台虚拟机,用作代理110. 虽然Zabbix模板中的英文很简单,但是为了同事着想,还是将大部分内容汉化了,避免今后说理解不 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
- 2016CCPC 中南地区邀请赛 A 矩阵快速幂
A A^n=A^(n%2016)%7; #include <iostream> #include <cstdio> #include <cstring> #incl ...
- 关于使用digitalocean的vps
先说说测试速度 平均在延迟125ms,机房选择新加坡 还有其他机房,比如伦敦,西海岸,阿姆斯特丹,基本全球覆盖. 以前用linode,virpus. linode以前有$5的套餐,现在最低都在10刀了 ...
- 基于Hadoop 2.2.0的高可用性集群搭建步骤(64位)
内容概要: CentSO_64bit集群搭建, hadoop2.2(64位)编译,安装,配置以及测试步骤 新版亮点: 基于yarn计算框架和高可用性DFS的第一个稳定版本. 注1:官网只提供32位re ...
- 13个不容错过的Java项目
今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自有代码或者学习编程技能.无论如何,开发工作当中我们几乎 ...
- 说点手动导jar包的细节Referenced Libraries
对于Referenced Libraries 若是手动,新建好Scala项目工程,这里取名为ScalaInAction 得需将Scala 2.11.8自带的,换成2.10.*版本 在其上,点击右键,B ...