嵌入式linux线程栈空间,堆、栈及静态数据区详解

内存分为代码区、全局数据区、堆区和栈区。堆一般存放动态数据,栈里一般存放局部成员。

关于堆栈和堆的概念

[问题]

C++中创建本地(或者说局域)变量是在堆栈(stack)中分配内存地址,而创建全局变量则是在堆(heap)中分配内存地址。

我想知道什么是堆(heap)?为什么全局变量和本地变量在分配内存地址时要分别对待,堆和堆栈哪一个更有效率?

[回答]

在Window中执行的每一个应用程序都有其自己的内存地址。一部分内存空间用于存放程序代码,一部分内存空间用于存放程序执行期间创建的变量。创将变量的方法有两种,一种是在堆中,另外一种则在堆栈里。

理解堆的最好的方法是将它看成一个程序随时可以使用的内存块。为了创建堆变量,程序要使用“new”(在C++里)操作符或者“malloc”(在C中)例程,它们返回指向变量的指针(堆变量总是通过指针来处理和操作)。最后程序用“delete”(在C++里)操作符或者“free”(在C中)例程来删除或者释放内存空间。

而堆栈则不同,它是某个函数被调用后随时可以创建的一小块内存,被用于在函数范围内保存变量(也称为自动变量)。在函数中,任何包含在{}内的代码都有其自己的堆栈。当这个函数或者{}退出时,堆栈以及它包含的所有内容都被摧毁。因此下面的代码是不运行的:

void Myfunction()

{ int i = 5;

{ int j = 6; }

int k = i + j;

}

所以本文问题的答案是:使用堆栈(stack)分配本地或者局域变量的地址空间,而用堆(heap)分配大块内存地址或者动态创建对象的情形。

例如:

void MyFunction() {

int i = 5; // 堆栈中的本地(自动)变量 int *iArray; // 堆栈中的本地(自动)变量

iArray = new int[10000]; // 这一行代码将在堆中创建10000个元素的数组,由iArray指向其地址

for (int k = 0; k < 10000 ; k++)

{ iArray[k] = k + i;

cout << iArray[k] << "\n";

}

delete iArray; // 从堆中删除或释放数组占用的地址空间,否则将会有内存泄漏

} //函数结束 注意:iArray 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数组。

一般认为在C中分为这几个存储区

1、栈——由编译器自动分配释放

2、堆——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

3、全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

4、另外还有一个专门放常量的地方。——程序结束释放

在函数体中定义的变量通常是在栈上,用malloc,calloc,realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。

比如:

代码:

int a = 0; //全局初始化区

char *p1; //全局未初始化区

main()

{

你可能感兴趣的:(嵌入式linux线程栈空间)