侧边栏壁纸
博主头像
如此肤浅博主等级

但行好事,莫问前程!

  • 累计撰写 18 篇文章
  • 累计创建 8 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录
C++

C++ | 内存模型

如此肤浅
2022-04-12 / 0 评论 / 0 点赞 / 259 阅读 / 1,696 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-10-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

cpp使用三种(在cpp11中是四种)不同的方案来存储数,这些方案的区别在于数据保留在内存中的时间。

  1. 自动存储持续性:
    在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码时被创建,在执行完函数或代码块时,它们使用的内存被释放。cpp有两种存储持续性为自动的变量。

    自动变量存放在栈中。程序使用两个指针来跟踪栈,一个指针指向栈底——栈的开始位置,另一个指针指向堆顶——下一个可用内存单元。当函数被调用时,其自动变量将被加入到栈中,栈顶指针指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。

  2. 静态存储持续性:
    在函数定义外定义的变量 和 使用关键字static定义的变量 的存储持续性都为静态。它们在程序整个运行过程中都存在。未被初始化的静态变量的所有位都被设置为0。

    • cpp为静态存储持续性提供了3种链接性:
      ① 外部链接性(可在其他文件中访问)
      ② 内部链接性(只能在当前文件中访问)
      ③ 无链接性(只能在当前函数或代码块中访问)

      ...
      int global = 1000;	// 外部链接性
      static int one_file = 50;	// 内部链接性
      int main(){
          ...
      }
      void funct1(int n){
          static int count = 0;	// 无链接性
          int llama= 0;
          ...
      }
      
    • 单定义规则:
      变量只能定义一次!在每个使用外部变量(链接性为外部的变量)的文件中,都必须声明该外部变量。因此cpp提供了两种变量声明,一种是定义声明,简称定义,它给变量分配存储空间;另一种是引用声明,简称声明,它不给变量分配存储空间,因为它引用已有的变量。 引用声明使用关键字extern,且不进行初始化;否则,声明为定义,导致分配存储空间。

      因此,在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字extern声明它。

      // file01.cpp
      extern int cats = 20;	// definition
      int dogs = 22;	// definition
      int fleas;	// definition
      
      // file02.cpp
      // use cats and dogs from file01.cpp
      extern int cats;
      extern int dogs;
      
      // file98.cpp
      // use cats, dogs and fleas from file01.cpp
      extern int cats;
      extern int dogs;
      extern int fleas;
      
    • 无连接性
      在代码块中使用static时,将导致局部变量的存储持续性为静态的。这意味着虽然该变量只在该代码块中可用,但它在该代码块不处于活动状态时仍然存在。因此在两次函数调用之间,静态局部变量的值将保持不变。另外,如果初始化了静态局部变量,则程序只在启动时进行一次初始化。以后再调用函数时,将不会像自动变量那样再次被初始化。

    • const对默认存储类型的影响
      在cpp中,const限定符对默认存储类型稍有影响。在默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的。也就是说,在cpp看来,全局const定义就像使用了static说明符一样。

      若希望某个常量的链接性为外部的,则可以使用extern关键字来覆盖默认的内部链接性。在这种情况下,必须在所有使用该常量的文件中使用exterm关键字来声明它。这与常规外部变量不同,定义常规外部变量时,不必使用 extern 关键字,但在使用该变量的其他文件中必须使用extern。

      extern const int states = 50;
      
  3. 线程存储持续性(cpp11):
    当前,多核处理器很常见。这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local声明的,则其生命周期与所属的线程一样长。

  4. 动态存储持续性:
    new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内在的存储持续性为动态,有时被称为自由存储(free store)或(heap)。

0
博主关闭了当前页面的评论