gpt4 book ai didi

c++ - 编译器 : How is class instantiation code compiled?

转载 作者:行者123 更新时间:2023-11-30 02:30:23 25 4
gpt4 key购买 nike

假设我们有(在 C++ 中):MyClass* x = new MyClass(10)

有人能解释一下当编译器解析这个语句时“到底”发生了什么吗? (我试着看了一下 Red Dragon 的书,但找不到任何有用的东西)。

我想知道堆栈/堆或编译器的符号表中发生了什么。编译器如何跟踪 x 变量的类型?稍后对 x->method1(1,2) 的调用将如何解析为 MyClass 中的适当方法(为简单起见,假设没有继承并且 MyClass 是唯一的类我们有)。

最佳答案

MyClass* x 是指向类型为 MyClass 的对象(实例)的指针的定义。该变量的内存是根据其定义的位置分配的:如果它是在方法中定义的,并且是局部变量,则使用堆栈。并且是存储地址的内存。

然后表达式new MyClass(10) 是一个命令,为对象(实例)本身在堆中分配内存,并返回要存储在x 中的地址。为了填充新对象 MyClass 的内存(设置其初始状态),自动执行特殊方法(至少一个) - 构造函数(或在某些情况下几个) - 接收值 10 在你的例子中。

因为 C++ 允许继承(这也是创建实例时执行多个构造函数的原因),所以有一些机制可以确定究竟应该调用哪个方法。您应该在某处阅读有关 Virtual method table 的内容.

在最简单的情况下(没有继承),变量x 的类型(指向类型MyClass 的对象的指针)提供了关于对象结构的所有必要信息。因此,x->method1(1,2)(*x).method1(1,2) 提供成员 method1 的调用使用参数 12(存储在堆栈中)以及构成对象状态的数据(存储在堆中)并可通过 this< 执行它 类的任何非静态成员内的指针。当然,方法本身并没有存储在堆中。

更新:

你可以举个例子来做同样的实验,比如:

#include <iostream>
#include <string>
using namespace std;

class MyClass
{
private:
int innerData;
long long int lastValue;
public:
MyClass() // default constructor
{
cout << "default constructor" << endl;
innerData = 42;
lastValue = 0;
}
MyClass(int data) // constructor with parameter
{
cout << "constructor with parameter" << endl;
innerData = data;
lastValue = 0;
}
int method1(int factor, int coefficient)
{
cout << "Address in this-pinter " << this << endl;
cout << "Address of innerData " << &innerData << endl;
cout << "Address of lastValue " << &lastValue << endl;
cout << "Address of factor " << &factor << endl;
lastValue = factor * innerData + coefficient;
return lastValue;
}
};

int main(void)
{
MyClass* x = new MyClass(10);
cout << "addres of object " << x << endl;
cout << "addres of pointer " << &x << endl;
cout << "size of object " << sizeof(MyClass) << endl;
cout << "size of pointer " << sizeof(x) << endl;
x->method1(1, 2);
}

关于c++ - 编译器 : How is class instantiation code compiled?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38734761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com