问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

高手请进 关于内存管理

发布网友 发布时间:2022-03-31 02:38

我来回答

1个回答

热心网友 时间:2022-03-31 04:07

堆和栈的区别

一般认为在c中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静
态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分
配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪
里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,
不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,
函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"12345
6"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和
递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有
的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。
并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时
是寻找匹配的内存的。而用栈则不会产生碎片。
在栈上存取数据比通过指针在堆上存取数据快些。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。

堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念

都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。

在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示

,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。

具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现

在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。

这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支

持的数据类型,并不直接支持其他的数据结构。因为栈的这种特点,对栈的使用在程序

中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的call指令里隐含了把

返回地址推入栈,然后跳转至子程序地址的操作,而子程序中的ret指令则隐含从堆栈中

弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈的例子,这也就是为什

么当函数返回时,该函数的自动变量自动失效的原因(因为 颜换指戳说饔们暗 状态)。

和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由

函数库提供的。基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当程序

使用这些函数去获得新的内存空间时,这套函数首先试图从内部堆中寻找可用的内存空

间,如果没有可以使用的内存空间,则试图利用系统调用来动态增加程序数据段的内存

大小,新分配得到的空间首先被组织进内部堆中去,然后再以适当的形式返回给调用者

。当程序释放分配的内存空间时,这片内存空间被返回内部堆结构中,可能会被适当的

处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这

套复杂的分配机制实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下若

干原因:

1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其

倍数的内存请求(按页分配);这样的话对于大量的小内存分类来说会造成浪费。

2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。

3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。

堆和栈的对比

从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有*,数据不灵活

;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低

。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一

。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编

译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配

无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是

不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回

系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。

可以放一块思考
堆和栈的生长方向恰好相反,
|--------------| 低地址
| 堆 |
|--------------|
| | |
| I |
| |
| ^ |
| 栈 | 高地址
-----------------
所以计算机中的堆和栈经常时放一块讲的

nod 一般不是必要就不要动态创建,最讨厌把new出来的东西当局部变量用,用万了马上
delete 的做法.

理由
1.栈分配比堆快,只需要一条指令就呢给配所有的局部变量
2.栈不会出现内存碎片
3。栈对象好管理

当然,某些情况下也要那么写,比如
1.对象很大
2.对象需要在某个特定的时刻构造或析够
3.类只允许对象动态创建,比如VCL的大多数类

当然,必须用堆对象时也不能躲避

DRAM是动态存储器(Dynamic RAM)的缩写SDRAM是英文SynchronousDRAM的缩写,译成中文就是同步动态存储器的意思。从技术角度上讲,同步动态存储器(SDRAM)是在现有的标准动态存储器中加入同步控制逻辑(一个状态机),利用一个单一的系统时钟同步所有的地址数据和控制信号。使用SDRAM不但能提高系统表现,还能简化设计、提供高速的数据传输。在功能上,它类似常规的DRAM,且也需时钟进行刷新。可以说,SDRAM是一种改善了结构的增强型DRAM。目前的SDRAM有10ns和8ns。
电脑高手请进-内存的问题

这个是因为Win732位系统最多能用到3.25G内存吧,或者有的机子才2G多~!解决方法就是换64位的系统才会完全利用到大内存!我自己以前的老本本也是那样,加到4G内存32系统刚开始才2.4多点,然后我升级了下BIOS涨到2.99G,最后换成64位系统才到3.86G内存!主要我的本本比较老了硬件跟不上!

电脑高手进!关于内存问题(急)

估计是骗你的,用的话只要系统稳定就行了,不行的花可以充装一遍系统或者找个测试软件检测一下,333和400同使用就是把400降频倒333用了,老主板如果不支持400的话用问题不大,支持400的用就是稍慢一点!

关于任务管理器中显示的内存的问题,高手请进

这是正常的情况,运行了程序,内存当然占用多 不过512M内存有点小,建议1GB 不过,建议你开瑞星监控,防网页病毒 你关闭这些还...你开机看下是多少?超过150M应该是自启动了很多程序.

有关内存时序问题,高手请进!

如楼上所说,其实一般的主板都支持自动设置,你把内存插上去就行了,会默认最低的方式运行,不用你管的.

高手请进 关于内存管理

1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其 倍数的内存请求(按页分配);这样的话对于大量的小内存分类来说会造成浪费。2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易...

最次电脑的N个难题,高手请进!

当遇到最次电脑的N个难题时,作为高手的你,请进来看看这篇指南。首先,解决内存问题,可以尝试将两根内存条分别插入,使用一根测试。如果两者均无问题,可能是因为兼容性不佳。检查内存无误后,若硬盘为新购,需留意数据线是否正确。更换一根数据线进行测试,可能解决问题。其次,对于电脑频繁重启的状况,...

BIOS高手请进!!!

一.Main(标准设定)此菜单可对基本的系统配置进行设定。如时间,日期等 legacy (传统的,遗传的) Diskette (磁碟,软碟) A Primary 主要的,首先的/Secondary 次要的,第二的IDE Master 主盘/Slave 从盘 是从主IDE装置如果你的主板支持SATA接口就会有Third/Fourth IDE Mastert或者更多,他们分别管...

电脑高手请进,什么叫做该内存不能为"read"或者别的一些英文

电脑高手请进,什么叫做该内存不能为"read"或者别的一些英文 "0x00531934"指令引用的"0x7e5f5618"内存。该内存不能为"written"。要终止程序,请单击"确定"。要调试程序,请单击"取消"。有时候碰到的是该内存不能为"read"。这是什么原因?怎么解决... "0x00531934"指令引用的"0x7e5f5618"内存。该内存不能为...

电脑配置问题,高手请进~

关于电脑配置问题,您提到了一个相对经济的选择,主要部件包括AMD Athlon64 X2 4000+ AM2处理器、昂达 A78GT/128M主板、金士顿 1GB DDR2 800内存(两根)、日立 160G 7200转硬盘、金河田飓风II 8197机箱。总预算约为1777元。该配置可满足目前主流游戏需求,特别是支持2GB内存的780G主板能提供良好的...

高手请进。。关于最高指挥官2问题。。高悬赏

(2)电脑硬件配置过低或硬件配置不合理,尤其是运行大型游戏时,不能正常运行。必要时升级或更换电脑显卡、内存条等硬件。(硬件上一般不会出现该问题)【6】软件引起的:(1)如果装的软件多,导致系统混乱或内存溢出也会出现该错误。安装的软件与系统或其它软件发生冲突,盗版或带病毒的软件,请慎重...

内存管理和存储管理 手机内存管理 手机内存管理在哪 什么是内存管理 段页式内存管理 内存管理的方式 给我打开内存管理 内存管理机制 内存管理的主要功能
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
借款担保人被拘15天,现在拘留所说法院下通知续15天,这样可行吗! 贷款未还拘留担保人,现在拘留了15天了法院说还要15天,这个可以一直连续... 拘留期间能与家人见面吗 我帮朋友担保了四万元钱,现在法院要我还,不还就要拘留我,请问法院能... lol后期6神装谁能单挑龙龟?狗头和小法不算。 仓储合理化的有效措施有哪些 英雄联盟团战致命错误有什么 如果所有人都把攻击打到龙龟身上,是不是一... 英雄联盟,他们都说剑姬是单挑王,可是,后期,龙龟龙女随便一个肉,一堆... 英雄联盟打野剑圣要出什么装备才可以打得过全肉龙龟? 我出的是 攻速... 收集张家港各乡镇逢集表 最好附有详细地址和日期 回答满意的加分 汽车上面粘贴塑料用什么胶水 又不毁坏漆面 英语中有那些关于Animals词汇有那些???急急急!... 飞越丛林蓝线有什么项目 汽车塑料仪表台裂缝用什么胶可以粘合? 汽车前挡风玻璃的塑料用什么胶水粘? 用什么胶水可以把汽车后塑料保险杠粘起来 汽车件tpo塑料什用什么胶水粘 汽车的塑料油箱漏汽油用什么胶可以粘牢 粘汽车上的硬塑料用什么胶好 什么胶水可以把汽车后塑料保险杠粘起来? 汽车水箱塑料部分开裂导致漏水,用什么方法可以修... 汽车塑料用什么胶水粘 汽车硬塑料用什么胶可以粘牢? 车门框上的黑塑料用什么胶粘? 贵州茅台怎么了?有人说下吗? 贵州茅台酒的历年价格 梦见观音菩萨 麻烦大家帮忙解梦! 女人梦见观音菩萨佛像不在原来的位置求解答 梦见观音佛像向前晃动什么予兆? 梦见观音菩萨像在泥潭里,我把她移到有香火地方。... 这汽车塑料裙边用什么胶水粘住? 有什么方法可以减小大象对地面的压强方法 汽车内饰塑料用什么胶水粘? 发愁啊!个子高,却长的很胖哦,被人叫做大象,怎么... 小学语文修改病句 儿子遥控车一个塑料零件折了,用502粘不上,大神们... 我掰手腕掰不过人家 了 电动车塑料壳子用什么胶粘最结实? 求一个奥运有关的搞笑段子 请问韩国的综艺节目《家庭诞生》到现在共有多少期? 家族诞生 演出名单。 家族诞生了至今有哪些明星参加过? 21岁65公斤 主要肥胖在屁股 大腿 腰部 因为工作需... 学生课外创意手工小制作的图书目录 大象腿,求帮忙,有什么办法瘦大腿,和长高,适合... 十七岁有大象腿水桶腰怎么运动燃脂 想问怎么可以瘦大象腿。 还有我小腿上有很多白线怎... 腿粗是每个女孩的烦恼,哪些方法能摆脱大象腿? 养殖石鸡市场前景如何 石鸡养殖在注意些什么?