在堆对象的上下文中理解堆栈

Understanding the stack in the context of heap objects

本文关键字:堆栈 上下文 对象      更新时间:2023-10-16

使用下面的简单代码。d是堆栈上指向堆上demo对象的指针。该对象包含val。在类的上下文中,这似乎是一个堆栈变量,但对象是在堆上分配的。那么val到底在哪里呢?

class demo
{
    int val;
public:
    demo() : val(5) {};
};
demo* d = new demo();
变量val位于堆上,因为它是位于堆上的对象的一部分。每个线程都有自己的堆栈,但单个对象没有。只有在静态声明d的情况下,val才会位于堆栈上。

无论对象存储在堆栈或堆上,val始终与demo对象的第一个成员位于同一内存地址。

§1.8.6

除非对象是位字段或大小为零的基类子对象,否则该对象的地址是它所占用的第一个字节的地址。既不是位字段也不是大小为零的基类子对象的两个不同对象应具有不同的地址。