• 内存结构:
    • 静态、全局内存:
      • 静态变量和全局变量存储在一块内存中,内部又分为初始化区和未初始化区,分别存储初始化和未初始化的全局、静态变量。
      • 全局变量作用域:全局作用域(全局变量只需要在一个源文件中定义,即可运用于所有的源文件,使用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 }
posted on 2017-03-19 20:56  Daniel_z  阅读(209)  评论(0编辑  收藏  举报