静态存储和大对象
Static storage and large objects
据我所知,static
关键字有两个作用:
- 它将变量分配在堆上而不是堆栈上。 存储空间
- 它标记变量的生命周期与其父进程的生命周期一样长。 范围
因此,在以下情况下使用它:
- 变量太大,会溢出堆栈。 存储使用
- 变量需要在函数的进程生命周期内可用。 使用范围
但是,如果变量很大,但不需要一直可用,并且一直将其保存在堆中会占用大量内存怎么办?
遇到这种情况我该怎么办?我不确定我是否完全理解 static 关键字的用途。
关键字static
大概可以看作是"overloaded"。
以下使用选项都是可行的:
- 静态局部变量
- 静态全局变量
- 静态成员变量
- 静态全局函数
- 静态成员函数
变量:
在运行时方面,所有类型的静态变量本质上都是一样的。它们都驻留在程序的 data-section 中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间唯一的区别是在编译时,在声明的范围内:
- 静态局部变量:编译器只在函数范围内识别
- 静态全局变量:编译器只在文件范围内识别
- 静态成员变量:只在class
范围内被编译器识别
函数:
在运行时方面,所有类型的函数(静态和非静态)本质上是相同的。它们都驻留在程序的 code-section 中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间唯一的区别是在编译时,在声明的范围内:
- 静态全局函数:编译器只在文件范围内识别
- 静态成员函数:编译器只在class
范围内识别
C++ 中的 static
关键字或多或少与您描述的持久存储相关,但根据具体上下文有一些细微差别:
--全局范围内的静态变量。
--局部函数范围内的静态变量。
--静态class成员。
--静态class方法。
我建议您在一些教程中查看所有这些案例。
我认为您误解的一个概念点是 static
本身与大小相关的存储效率无关。如果需要处理大数据,可以使用动态 allocation/deallocation (new
/delete
)。换句话说,这是一个内存管理问题,处理这个问题的各种技术与构造函数、析构函数、智能指针等有关...
据我所知,static
关键字有两个作用:
- 它将变量分配在堆上而不是堆栈上。 存储空间
- 它标记变量的生命周期与其父进程的生命周期一样长。 范围
因此,在以下情况下使用它:
- 变量太大,会溢出堆栈。 存储使用
- 变量需要在函数的进程生命周期内可用。 使用范围
但是,如果变量很大,但不需要一直可用,并且一直将其保存在堆中会占用大量内存怎么办?
遇到这种情况我该怎么办?我不确定我是否完全理解 static 关键字的用途。
关键字static
大概可以看作是"overloaded"。
以下使用选项都是可行的:
- 静态局部变量
- 静态全局变量
- 静态成员变量
- 静态全局函数
- 静态成员函数
变量:
在运行时方面,所有类型的静态变量本质上都是一样的。它们都驻留在程序的 data-section 中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间唯一的区别是在编译时,在声明的范围内:
- 静态局部变量:编译器只在函数范围内识别
- 静态全局变量:编译器只在文件范围内识别
- 静态成员变量:只在class 范围内被编译器识别
函数:
在运行时方面,所有类型的函数(静态和非静态)本质上是相同的。它们都驻留在程序的 code-section 中,并且它们的地址在整个程序执行过程中保持不变。所以它们之间唯一的区别是在编译时,在声明的范围内:
- 静态全局函数:编译器只在文件范围内识别
- 静态成员函数:编译器只在class 范围内识别
C++ 中的 static
关键字或多或少与您描述的持久存储相关,但根据具体上下文有一些细微差别:
--全局范围内的静态变量。
--局部函数范围内的静态变量。
--静态class成员。
--静态class方法。
我建议您在一些教程中查看所有这些案例。
我认为您误解的一个概念点是 static
本身与大小相关的存储效率无关。如果需要处理大数据,可以使用动态 allocation/deallocation (new
/delete
)。换句话说,这是一个内存管理问题,处理这个问题的各种技术与构造函数、析构函数、智能指针等有关...