- 内存结构:
- 静态、全局内存:
- 静态变量和全局变量存储在一块内存中,内部又分为初始化区和未初始化区,分别存储初始化和未初始化的全局、静态变量。
- 全局变量作用域:全局作用域(全局变量只需要在一个源文件中定义,即可运用于所有的源文件,使用extern关键字声明要引用的全局变量)
- 全局变量生命周期:程序运行期一直存在
- 程序结束后由系统进行释放
- 例子:
1 //define.cpp 2 int value = 1; 3 4 //main.cpp 5 #include <iostream> 6 extern int value;//在另一个源文件中声明要引用的变量 7 8 int main(){ 9 std::cout << value << std::end; 10 return 0; 11 }
- 全局静态变量作用域:被定义的源文件中可用
- 全局静态变量生命周期:程序运行期一直存在
- 静态局部变量作用域:局部变量的作用域
- 静态局部变量生命周期:程序运行期一直存在
- 文字常量区:
- 常量字符串的存储区域,程序结束之后由系统释放。
- 程序代码区:
- 存放函数体的二进制代码。
- 栈区:
- 栈区,由编译器自动分配/释放内存空间,存放函数的参数值以及局部变量。
- 局部变量作用域:从局部变量定义处开始,直到所在函数结束处
- 局部变量生命周期:程序运行到函数结束处,该变量内存被释放
- 堆区:
- 堆区,用来分配动态内存区,操作系统提供了malloc等内存分配机制给程序员进行内存的申请分配,当然也要由其进行内存的释放,若没有手动释放,程序结束时可能由OS回收。
- 静态、全局内存:
- 一些定义变量的小技巧:
- 若需要定义一个全局变量,此时需要考虑该变量是否需要其他文件对其进行访问,如果没有这个需求,则可以定义为静态局部变量,降低模块间的耦合度
- 若要定义一个只被一个函数访问的全局变量,则可以将该变量定义为该函数内的静态局部变量,只会初始化一次,来降低模块间的耦合度
- 从网上找的一个很有代表性的code
-
1 //main.cpp 2 int a = 0; //全局变量,全局初始化区 3 char *p1; //全局变量,全局未初始化区 4 5 int main(){ 6 int b; //局部变量,栈区 7 char s[] = "abc";//局部变量,栈区 8 char *p2;//局部变量,栈区 9 char *p3 = "123456";//局部变量,p3在栈区,“123456”在常量区 10 static int c = 0;//静态变量,全局(静态)初始化区 11 p1 = (char*)malloc(10);//malloc申请内存,存储在堆区 12 p2 = (char*)malloc(20); 13 14 }