静态存储和大对象

Static storage and large objects

据我所知,static 关键字有两个作用:

  1. 它将变量分配在堆上而不是堆栈上。 存储空间
  2. 它标记变量的生命周期与其父进程的生命周期一样长。 范围

因此,在以下情况下使用它:

  1. 变量太大,会溢出堆栈。 存储使用
  2. 变量需要在函数的进程生命周期内可用。 使用范围

但是,如果变量很大,但不需要一直可用,并且一直将其保存在堆中会占用大量内存怎么办?

遇到这种情况我该怎么办?我不确定我是否完全理解 static 关键字的用途。

关键字static大概可以看作是"overloaded"。

以下使用选项都是可行的:

  • 静态局部变量
  • 静态全局变量
  • 静态成员变量
  • 静态全局函数
  • 静态成员函数

变量:

在运行时方面,所有类型的静态变量本质上都是一样的。它们都驻留在程序的 data-section 中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间唯一的区别是在编译时,在声明的范围内:

  • 静态局部变量:编译器只在函数范围内识别
  • 静态全局变量:编译器只在文件范围内识别
  • 静态成员变量:只在class
  • 范围内被编译器识别

函数:

在运行时方面,所有类型的函数(静态和非静态)本质上是相同的。它们都驻留在程序的 code-section 中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间唯一的区别是在编译时,在声明的范围内:

  • 静态全局函数:编译器只在文件范围内识别
  • 静态成员函数:编译器只在class
  • 范围内识别

C++ 中的 static 关键字或多或少与您描述的持久存储相关,但根据具体上下文有一些细微差别:

--全局范围内的静态变量。

--局部函数范围内的静态变量。

--静态class成员。

--静态class方法。

我建议您在一些教程中查看所有这些案例。

我认为您误解的一个概念点是 static 本身与大小相关的存储效率无关。如果需要处理大数据,可以使用动态 allocation/deallocation (new/delete)。换句话说,这是一个内存管理问题,处理这个问题的各种技术与构造函数、析构函数、智能指针等有关...