静态存储和大型对象

时间:2015-04-03 14:28:46

标签: c++ c static scope storage

据我所知,static关键字做了两件事:

  1. 它在堆上而不是堆栈上分配变量。 存储
  2. 它标记变量的生命周期,只要其父进程的生命周期。 范围
  3. 因此,在以下情况下使用:

    1. 变量太大,以至于它会溢出堆栈。 存储使用
    2. 变量需要在函数进程的生命周期内可用。 范围使用
    3. 但是,如果变量如此之大,但不需要一直可用,并且在堆中一直保留它会是内存昂贵的呢?

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

2 个答案:

答案 0 :(得分:1)

c ++中的static关键字或多或少与您描述的持久存储有关,但根据具体情况有几个细微差别:

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

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

- 静态类成员。

- 静态类方法。

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

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

答案 1 :(得分:0)

关键字static可能会被视为有些“过载”。

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

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

变量:

就运行时而言,所有类型的静态变量基本相同。它们都位于程序的数据部分中,并且它们的地址在程序执行期间保持不变。因此,它们之间的唯一区别是在编译期间,在声明范围内:

  • 静态局部变量:仅在函数范围内由编译器识别
  • 静态全局变量:仅在文件范围内由编译器识别
  • 静态成员变量:仅在类
  • 的范围内由编译器识别

功能:

就运行时而言,所有类型的函数(静态和非静态)基本相同。它们都驻留在程序的代码段中,并且它们的地址在程序执行期间保持不变。因此,它们之间的唯一区别是在编译期间,在声明范围内:

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