b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

堆栈内存和堆内存之间的区别

电脑杂谈  发布时间:2020-08-05 05:06:45  来源:网络整理

c堆内存和栈内存_内存堆和栈怎么管理_jvm 堆内存与栈内存

摘要:

1堆栈: 自动为编译器分配和释放,例如函数参数,局部变量,临时变量等.

2堆: 分配和释放成员,这些成员是程序员自己请求和释放的. 否则会发生内存泄漏. 通常,堆的内容用于新应用程序.

除了这两部分,还有另一部分:

3静态存储区: 编译程序时分配了内存,并且该内存在程序的整个运行期间都存在. 它主要存储静态数据,全局数据和常量.

转发自:

堆栈内存和堆内存之间的差异(书面测试的一部分)

书面测试标题: 请说明堆栈存储器和堆存储器之间的区别. 请分析以下代码操作是否存在问题. 如果有问题,请更正.

char * GetMemory(void)

{

char p [] =“ Hello world”;

返回p;

}

c堆内存和栈内存_jvm 堆内存与栈内存_内存堆和栈怎么管理

void main(void)

{

char * str = GetMemory();

printf(str);

}

首先看第一个问题: 堆栈内存和堆内存之间的区别

程序存储器分配

堆栈: 它由编译器自动分配和释放,存储函数参数,局部变量,临时变量,函数返回地址等;

堆(heap): 通常,程序员进行分配和释放. 如果没有手动发布,则可能会在程序结束时由操作系统自动发布(?这可能适用于具有回收机制的Java之类的语言. 对于c / c ++,则必须手动发布打开的堆内存),稍有疏忽会导致内存泄漏.

2. 申请后系统响应

堆栈: 只要堆栈的剩余空间大于请求的空间,系统就会为程序提供内存,否则将报告异常以指示堆栈溢出.

堆: 在记录可用内存地址的链表中找到一个空间大于所请求空间的堆节点,然后从该空闲节点链表中删除该节点,并将该节点的空间分配给程序. 另外,对于大多数系统,分配空间的大小将记录在该存储空间的第一个地址,以便代码中的删除操作可以正确释放该存储空间. 系统会将冗余部分恢复到空闲列表中.

3. 应用程序大小限制

jvm 堆内存与栈内存_内存堆和栈怎么管理_c堆内存和栈内存

堆栈: 在Windows中,堆栈是一个扩展到低位地址的数据结构,并且是一个连续的内存区域. 这句话意味着系统要预先定义堆栈顶部的地址和堆栈的最大容量. 在WINDOWS下,堆栈的大小为2M(有人说是1M,简而言之,它是在编译时确定的常数). 当请求的空间超过堆栈的剩余空间时,将提示溢出. 因此,堆栈中可用的空间较小.

堆: 堆是一种扩展到高地址的数据结构,并且是一个不连续的内存区域. 这是因为系统使用链接列表存储自然不连续的空闲内存地址,并且链接列表的遍历方向是从低地址到高地址. 堆的大小受计算机系统中有效虚拟内存的限制. 可以看出,堆获得的空间更加灵活,更大.

4. 分配效率

堆栈: 由系统自动分配,速度更快. 但是程序员无法控制它.

堆: new分配的内存通常较慢并且容易出现内存碎片,但是使用起来最方便. 另外,在WINDOWS下,分配内存的最佳方法是使用VirtualAlloc,而不是在堆中,也不是在堆栈中,尽管使用起来最不方便,但堆栈直接在进程的地址空间中保留快速内存. 但这是最快,最灵活的

5. 商店内容

堆栈: 在堆栈中,第一个要压入堆栈的是主函数下一条指令的地址,然后是该函数的参数. 在大多数编译器中,参数从右到左被压入堆栈,然后函数Local变量被压入堆栈. 请注意,静态变量不在堆栈中. 弹出顺序正好相反.

堆: 通常,一个字节用于在堆的开头存储堆的大小,具体内容由程序员安排.

根据《 C ++内存管理技术内幕》一书,在C ++中,内存分为5个区域,分别是堆,堆栈,可用存储区,全局/静态存储区和恒定存储区.

a)堆栈: 内存在需要时由编译器自动分配和释放. 通常用于存储局部变量和函数参数. (为运行该功能而分配的局部变量,函数参数,返回地址等存储在堆栈区域中). 堆栈操作分配内置在处理器的指令集中,虽然效率很高,但是分配的内存容量有限.

b)堆: 内存分配有新内存,并通过delete或delete []释放. 如果内存释放不正确,将导致内存泄漏. 但是在程序结束时,它将由操作系统自动回收.

c)可用存储区: 使用malloc进行分配,使用free进行恢复. 类似于堆.

d)全局/静态存储区: 全局变量和静态变量分配到同一内存. C语言区分初始化和未初始化,因此在C ++中不再区分. (全局变量,静态数据和常量存储在全局数据区域中)

jvm 堆内存与栈内存_内存堆和栈怎么管理_c堆内存和栈内存

e)常量存储区: 存储不允许修改的常量.

在这里,C ++内存分配在某些材料中定义. 可编程存储器基本上分为几部分: 静态存储区,堆区和堆栈区. 它们的功能不同,因此使用方式也不同.

a)静态存储区: 编译程序时分配内存,并且该内存在程序的整个运行期间都存在. 它主要存储静态数据,全局数据和常量.

b)堆栈区: 执行函数时,可以在堆栈上创建函数中局部变量的存储单元,并且在执行函数时会自动释放这些存储单元. 堆栈内存分配操作内置在处理器的指令集中,虽然效率很高,但是分配的内存容量有限.

c)堆区域: 也称为动态内存分配. 程序运行时,请使用malloc或new来申请任何大小的内存,并且程序员负责在适当时使用free或delete释放内存. 动态内存的寿命可以由我们确定. 如果不释放内存,程序将在最后释放动态内存. 但是,一种好的编程习惯是: 如果不再使用某个动态内存,则需要释放它,否则,我们认为发生了内存泄漏.

\

图3典型的C ++内存区域

摘要: C ++和C语言之间的内存分配有所不同,但总体上是相同的,不会影响程序分析. 就C ++而言,它是5部分还是3部分,但是除法是不一致的. 将5)部分中的c)d)e)组合为3)a).

以下代码段会让您感觉很清楚:

void fn()

{

int * p =新的int [5];

}

内存堆和栈怎么管理_c堆内存和栈内存_jvm 堆内存与栈内存

当您看到new时,首先应该认为我们已经分配了一块堆内存,指针p呢?它分配了一块堆栈内存,因此这句话的意思是: 指向一块堆内存的指针存储在堆栈内存中的指针p. 该程序将首先确定在堆中分配的内存大小,然后调用new运算符分配内存,然后返回该内存的第一个地址并将其放在堆栈中.

注意: 为简单起见,此处未释放内存,那么如何释放它呢?是删除吗?不,是的,应该是delete [] p,它告诉编译器: delete是一个数组.

// main.cpp

int a = 0;全局初始化区

字符* p1;全球未初始化区域

main()

{

int b;堆栈

char s [] =“ abc”;堆栈

char * p2;堆栈

char * p3 =“ 123456”; 123456 \ 0位于常量区域,而p3位于堆栈中.

static int c = 0;全局(静态)初始化区域

p1 =(字符*)malloc(10);

p2 =(char *)malloc(20);

分配的10和20个字节在堆区域中.

strcpy(p1,“ 123456”); 123456 \ 0放置在常量区域中,编译器可以对其进行优化,并将p3指向的“ 123456”放在一个位置.

}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-292185-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 刘孟荀
        刘孟荀

        这样才真正划清12海里

      热点图片
      拼命载入中...