栈(stack)、堆(heap)
概念:堆和栈都是数据结构,是一个特殊的存储区,主要用来暂时存放数据和地址。
栈:其同数据结构中的栈类似。用于存储参数和局部变量。该存储空间不用申请,有操作系统自动分配和释放。
栈在中文中就说一个仓库,所以类似仓库你先放进去的最后才能取出。也就类似先放进去的最后释放。其实栈是相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。
优点:读取速度较堆要快,
缺点:灵活性低,数据大小和生命周期有限。栈中存放的数据无法在多线程之间共享。
堆:其同数据结构中的栈不是一个概念。要有程序员自己申请和释放,如果不释放可能在程序结束时,有系统收回。其遵循先进先出的原则。
优点:比较灵活,能够自己规定分配内存的大小,编译器无法获知其生命周期。
缺点:由于在运行时才能分配动态空间,会降低运行速度。
具有存储概念的名词还有:全局去,文字常量区,程序代码区
全局区:有static修饰的变量,全局变量和静态变量的存储是放在一块的,程序结束后由系统释放。
文字常量区:有程序结束后系统释放。一些常量字符串就存储在该区。
程序代码区:将代码转换成二进制后存储的区域。
栈就例如我们只要结果,而不必担心如何达到这个结果。
而堆就要为自己的结果负责,自己的行为造成自己的结果。
注意:
1)在main函数之外的都是存储在全局区。
2)在main函数内部,有static 修饰的是全局区。
变量都处于栈中,字符串是位于常量区。
分配空间的语句造成的分配在堆。
这是一个前辈写的,非常详细
//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);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}
|