- 对象存储期(Storage Duration):
- 自动存储期(Automatic): 在栈上自动创建和销毁的对象,例如函数内的局部变量。
- 静态存储期(Static): 程序开始执行时分配直到程序结束才销毁的对象,包括全局变量和静态变量。
- 动态存储期(Dynamic): 通过
new
或malloc
在堆上分配的内存,必须显式用delete
或free
来释放。 - 线程存储期(Thread-local): 每个线程有自己独立实例的变量,其生命周期与所属线程一致。
- 内存分区:
- 栈(Stack): 用来存储自动存储期的局部变量,函数参数等。是由编译器自动管理内存的区域。
- 堆(Heap): 用于动态内存分配,需要程序员或智能指针来管理内存的释放。
- 全局/静态存储区(Global/Static Area): 存放全局变量和静态变量。
- 常量存储区(Constant Storage Area): 存储常量数据,如字符串常量等。
- 代码区(Code or Text Segment): 存放程序的机器代码。
- 多线程与原子操作: C++11引入了对并发的支持,定义了原子类型
std::atomic
和内存序(memory order)概念,使得程序可以在多线程环境下安全地进行读写操作而不引发数据竞争。 - 内存顺序: 内存模型还详细规定了操作的内存顺序,这涉及到编译器优化和处理器重排指令时必须遵守的规则,确保一致性和可见性。
- 同步和互斥: C++标准库提供了多种同步机制,如互斥锁
std::mutex
,条件变量std::condition_variable
等,它们的行为也被内存模型所覆盖。 - 顺序一致性: 当多个线程访问共享数据时,内存模型定义了保证顺序一致性的方法,即在不同线程看来,所有操作都是以相同顺序发生的。