存储类型
什么是?
存储类型影响对象在内存区域位置和生命周期。
虽然 C++ 和 Java 中的存储类型有所不同,但它们都是为了管理程序中的内存分配和释放而设计的。
有哪些?
C++
中的存储类型包括自动存储、静态存储、动态存储和线程存储四种存储类型。
- 自动存储
函数内部定义的变量。
生命周期:它们在函数调用时分配内存,在函数返回时释放内存;
位置:栈 - 静态存储
全局变量和静态变量。
生命周期:它们在程序运行期间一直存在,直到程序结束才释放内存;
位置:静态区域 - 动态存储
使用new
和delete
运算符动态分配和释放内存。
生命周期:程序员通过new
delete
亲自管理
位置:堆 - 线程存储
在线程局部存储区中分配的变量,它们只能在所属线程中访问。
Java
中只有栈内存和堆内存两种存储类型。栈内存用于存储基本数据类型和对象的引用变量,它们在方法调用时分配内存,在方法返回时释放内存;堆内存用于存储对象本身,它们在使用 new
关键字创建对象时分配内存,在对象没有被引用时由 Java 垃圾回收机制自动回收。
这是因为 C++ 是一种底层语言,需要手动管理内存,因此需要更多的存储类型来管理内存的分配和释放;而 Java 是一种高级语言,具有自动内存管理机制,因此只需要栈内存和堆内存两种存储类型来管理内存即可。
如何决定存储类型
- 关键字
- 或者对象申明的位置,例如类外,函数内,以及new关键字
存储类型关键字
C++ 中的存储类型关键字包括:
-
auto
:用于自动推导变量的类型。 -
register
:用于声明寄存器变量,建议使用register
关键字的变量不要取地址。 -
static
:用于声明静态变量,静态变量在程序运行期间只会被初始化一次。 -
extern
:用于声明外部变量或函数,表示该变量或函数在其他文件中定义。 -
mutable
:用于声明类的成员变量,表示该变量可以在 const 成员函数中被修改。 -
thread_local
:用于声明线程局部变量,表示该变量在每个线程中都有一份独立的副本。
这些存储类型关键字可以用于指定变量或函数的存储类型,从而影响它们在内存中的存储位置和生命周期。
Java 中的存储类型关键字包括:
-
static
:用于声明静态变量,静态变量在程序运行期间只会被初始化一次。 -
final
:用于声明常量,表示该变量的值在初始化之后不可更改。 -
transient
:用于声明对象的成员变量,表示该变量不会被序列化。 -
volatile
:用于声明变量,表示该变量可能会被多个线程同时访问。 -
synchronized
:用于声明方法或代码块,表示该方法或代码块在执行时会获取对象的锁。
这些存储类型关键字可以用于指定变量或方法的存储类型,从而影响它们在内存中的存储位置和访问方式。需要注意的是,Java 中没有类似 C++ 中的自动变量和寄存器变量的概念。