处理器如何处理未初始化的变量?

Ant*_*cic 0 c++ assembly

所以我有一个分配,我基本上必须在汇编中弄清楚变量是如何存储的,而且我在弄清楚 C++ 如何处理各种变量时遇到了问题。

MyClass var;
MyClass *p = new MyClass();
var.setX(3)
Run Code Online (Sandbox Code Playgroud)

我想我发现的是: *p 引用被存储在堆栈上,而创建的对象被分配在堆上。这意味着 p 正在引用创建的对象。请确认是否正确。

问题是var会发生什么,它是动态分配的吗?我正在查看程序集,但找不到任何可以指向我答案的内容。

Mil*_*nek 5

p存储在堆栈上是一种误导。 p具有自动存储持续时间,并且将存储在编译器决定存储它的任何地方,如果编译器决定将它存储在任何地方。它可能存储在堆栈中,或者它可能完全存在于寄存器中而根本不会在内存中结束。

var完全一样。由于您对其调用方法,因此它的空间很可能会在堆栈上保留,因为大多数调用约定都要求方法调用传递对象的地址。但也许不是。如果在setX调用时可以看到的完整定义,则编译器可能会内联调用。这一切都取决于程序的具体细节。这是编译器完全执行此操作的示例。请注意,根本没有任何部分var写入内存;它完全存储在esi.

同样,由 分配的对象new具有动态存储期限。这可能意味着它将存在于从系统堆分配的内存中,但这同样不是由 C++ 语言指定的。