这里的堆与栈指程序内存分配区域,不是数据结构中的堆与栈结构。
一个程序所占内存区域分为以下几部分
堆区:程序员手动分配的区域,比如通过new或malloc方式获得的内存区域。存放在堆区的内存要手动释放(delete,free)。堆区的数据及时程序运行结束也不会被释放,最终可能会被操作系统释放。堆区的内存分配方式和链表相似。堆区容量较大,使用灵活,但是速度比栈慢。堆的空间不是连续的(链表嘛)。
栈区:存放局部变量的区域(函数参数也是局部变量)。分配方式类似于数据结构中的栈(先进后出)。栈有系统自动分配和释放。栈的空间较小,据说windows下是2M。栈的空间是连续的空间。
全局区和静态区:全局变量和静态变量存在一个区域。初始化了的放在一个区域,没初始化的放在相邻的另一块。程序结束后由操作系统释放。
文字常量区:存放常量字符串的区域。程序结束后释放。
代码区:存放二进制代码。
下面代码作为例子(网上找的)
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"优化成一个地方。 }
-----------------------------------------------------------------------------------------------------------------------------------------------------------
网上还看到了一个新知识,记在这里:
char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb";初始化字符串的两种方式,以前一直以为两种方法是等价的,但是竟然有区别,看来大一时候就没学明白。。。第一行代码是在运行时赋值的,第二行在编译时就确定了。在以后的存取中,用第一种方法会快一些。比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到
edx中,再根据edx读取字符,显然慢了。