zoukankan      html  css  js  c++  java
  • 内存

    • 内存结构:
      • 静态、全局内存:
        • 静态变量和全局变量存储在一块内存中,内部又分为初始化区和未初始化区,分别存储初始化和未初始化的全局、静态变量。
        • 全局变量作用域:全局作用域(全局变量只需要在一个源文件中定义,即可运用于所有的源文件,使用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 }
  • 相关阅读:
    【笔记】初探KNN算法(2)
    【笔记】初探KNN算法(3)
    将onenote快速复制粘贴到博客园后台
    【笔记】numpy.array基础(2)
    【笔记】matplotilb数据可视化基础
    【笔记】numpy.array的常用基本运算以及对数据的操作
    【笔记】初探KNN算法(1)
    关于解决numpy使用sklearn时的警告问题
    【笔记】读取数据以及简单的数据探索
    【笔记】numpy.array基础(3)
  • 原文地址:https://www.cnblogs.com/danielStudy/p/6582217.html
Copyright © 2011-2022 走看看