堆栈:内存条里的某一块。
电脑中有6个地方可以保存数据。
<1>寄存器:保存最快。这东西在处理器内部。也就是CPU里的一小块地方给你放数据。既然是CPU,那么主要工作是计算,所以这块寄存器能放的东西十分有限,寄存器是由编译器分配。我们的程序里看不到的。
<2>栈:在RAM(随机访问存储器,就是内存)区域。通过操作堆栈指针可以直接操作这部分内存,例如,指针下移,创建新内存,上移,释放。这边所说的栈,严格说是栈,不是堆栈。堆栈是2个东西,创建程序时编译器需要知道从栈里分配多少存储空间,比较不自由。在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
<3>堆:也在RAM中。区别于栈就是堆不需要知道创建对象时需要从堆里分配多大的存储空间,也不知道存储多长时间。常和new一个对象相关。堆的大小受限于计算机系统中有效的虚拟内存。
<4>静态存储:也在RAM中,但是位于固定位置。程序运行时,固定位于一段存储空间里。通常用关键字static。
<5>常数存储:常数值通常直接放在程序代码内部。永远都不会改变。通常用关键字readonly。
<6>非RAM存储。如程序外部的一个流式对象,该对象变成字节流,通常发给另一台机器。或者是一个固定对象,就是硬盘等上的固定对象。这些都可以变成RAM中的对象,如将一个图片转换成filestream。
看完上面,大概就知道了堆和栈其实就是内存里的两种数据结构。
栈只能在栈顶对数据进行插入和删除,先进后出,后进先出。堆得话顺序就随意了。
栈区stack由编译器自动分配释放,存放函数的参数值,局部变量的值,操作方式类似数据结构中的栈。
堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
这是一个前辈写的,非常详细
//main.cpp
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);
}
堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
堆栈是一种存储部件,即数据的写入跟读出不需要提供地址,而是根据写入的顺序决定读出的顺序
值类型与引用类型
值类型吧,我感觉就是可以直接赋值的。而引用类型大部分是通过实例来进行操作的。
值类型和引用类型最根本的区别是:两者在内存中的分配位置不同,值类型(Value Type)的实例分配在线程的栈上,而引用类型(Reference Type)的实例总是从托管堆上分配内存。
值类型变量直接存储数据值,所以需要知道需要多大空间。
引用类型以new创建对象实例,并存储在堆中,并不需要知道确切需要多大空间。static class 是使用静态内存。不在堆栈中。
装箱和拆箱
将值类型转换为引用类型叫装箱。反之叫拆箱。引用类型就是个箱子,能把值装进去。
int i = 9;
obj j = i; //装箱。
转载于:https://blog.51cto.com/feelmanc/1250534