C++ 堆栈帧/激活记录和“this”指针

C++ Stack Frame/Activation Record and 'this' pointer

提问人:Cody M 提问时间:1/18/2021 更新时间:1/18/2021 访问量:249

问:

这是我在这里的第一篇文章,如果我搞砸了什么,我将不胜感激。 C++ 是否实现激活记录?我在这方面的经验主要是用 Java 的,所以我不确定其他语言是否也是如此。 如果是这样,在 C++ 中说“this”是指向激活堆栈上前一条记录的指针是否正确? 例如:

...
class Example {
private:
    int num;
public:
    void setNum(int num) {
        this->num = num;
    }
...

因此,激活堆栈上将有一个“Example”对象,然后当调用函数“setNum(...)”时,它会将该调用放在激活堆栈上。因此,“this”的类型为 Example*,并指向函数调用之前堆栈上的“Example”对象。这是对的吗? 谢谢大家!

C++ 指针 堆叠 激活

评论

1赞 David C. Rankin 1/18/2021
您正在混合术语。“堆栈帧”是为函数使用而创建的当前内存区域。“activation-record”(函数序言)保存所需的被调用方保存的寄存器,调用方将指针堆叠为当前帧指针,以便程序可以恢复被调用方保存的寄存器,并知道在函数返回时将控制权转移到何处。这些都不适用于对象的指针。this
0赞 Daniel Langr 1/18/2021
“所以这将指向函数调用之前堆栈上的示例对象?”不,一般来说,这是不正确的。 将指向实际对象,无论它在哪里。如果它位于堆上,则将指向堆上的此对象。thisthis
0赞 Daniel Langr 1/18/2021
无论如何,C++没有堆栈的概念。您需要查看实现详细信息,例如编译器或 ABI。

答:

0赞 Raildex 1/18/2021 #1

this仅存在于 或 中。它不存在于自由函数中。classstruct

this指向调用其成员函数的对象。

在本例中,指向 的实例,因此类型为thisExampleExample*

我不知道 ActivationRecord 这个词。C++不知道函数堆栈的概念,这只是一个实现细节。

0赞 SlyFox 1/18/2021 #2

在 с++ 中一切都非常糟糕。 将指针指向当前对象(的实例)。如果可以调用,那么你已经有了这个对象。您不需要它来为任何成员设置值。thisclass ExamplesetNum

class Example {
private:
    int num;
public:
    void setNum(int _num) {
        num = _num;
    }
};