函数中定义的对象是在栈中还是在堆中
2023-12-20 14:18:01
手机扫码访问
函数中定义的对象是在栈中还是在堆中?
首先说明这里的堆和栈不等同于数据结构中
堆和栈的概念。这里的
堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。
1
栈内存
(stack)栈是用来存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象。
2
堆内存
(heap)堆是由corder手动分配释放的,通过malloc和new等动态申请内存的语句使用,也需要用户手动回收(或可能在程序结束时OS自动回收),而对于面向对象程序来说,new出来的任何对象,无论是对象内部的成员变量,局部变量,类变量,他们指向的对象都存储在堆内存中(但指针本身存在栈中),一般速度较栈慢;存储地址通常是链式的,内存较大不会溢出。
个人的理解,有错希望大牛指出,谢谢。
以上内容延伸阅读:
堆和栈的区别是什么?
申请方式的不同:栈由系统自动分配,而堆是人为申请开辟。
申请大小的不同:栈获得的空间较小,而堆获得的空间较大。
申请效率的不同:栈由系统自动分配,速度较快,而堆一般速度比较慢。
空间大小不同:栈:获取空间较小。 在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。 堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。
生长方向不同:栈: 向低地址扩展的数据结构,是一块连续的内存的区域。 栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。 堆: 都是动态分配的,没有静态分配的堆。
以上就是堆和栈的区别,希望可以帮助到您。
js栈内存和堆内存的区别?
首先JavaScript中的变量分为基本类型和引用类型。基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。
1、基本类型
基本类型有Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
2、引用类型
引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。如下图所示:栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问当我们看到一个变量类型是已知的,就分配在栈里面,比如INT,Double等。其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。基本类型大小固定,引用类型大小不固定,分开存放使得程序运行占用内存最小。
3、栈内存:存放基本类型。 堆内存:存放引用类型(在栈内存中存一个基本类型值保存对象在堆内存中的地址,用于引用这个对象。)
4、基本类型在当前执行环境结束时销毁,而引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时这个对象才被垃圾回收机制回收。
本文于2023-12-20 14:18:01发表在866l生活。本文链接:https://www.866l.com/t/16941852848572.html