在创建类时没有分配内存,那么类中的变量保存在哪里?



在面向对象编程中,有类和对象的概念。我们定义一个类,然后创建它的实例(对象)。考虑下面的c++示例:

class Car{
public:
string model;
bool petrol;
int wheels = 4;
}
int main(){
Car A;
cout << A.wheels;
return 0;
}

现在我知道没有内存分配给类Car,直到对象A被创建。现在我陷入了困惑,如果没有给Car分配内存,那么在创建对象A时,对象A如何知道wheels等于4 ?我的意思是它应该保存在内存的某个地方。

请忽略错误,因为这是初学者的问题:)

这里有两种类型的存储。

Car信息保存在内存中。这是它的方法中的代码,它的布局,包括初始化wheels的字面值4。它存在于二进制可执行文件中,并且在应用程序运行时一直存在于内存中。

但是当你说"没有内存分配……"您正在考虑Car实例的内存,每次创建新实例时都会分配内存。

c++编译器生成可执行代码,将类成员默认初始化为4。保存在内存中的某处。你指的是编译器生成的可执行代码。构造对象并将其类成员设置为4的实际可执行代码。

一些编程语言有"类对象"的概念。这是一个对象,它保存有关类中的数据:它的成员、它的成员函数和它的基类。c++不这样做。关于类中内容的信息在编译器生成的可执行代码中。

在问题中的代码中,当创建Car类型的对象时,编译器生成的代码为Car对象分配了足够大的内存块。代码"知道";块中model的存储空间在哪里,petrol的存储空间在哪里,wheels的存储空间在哪里。由于wheels成员具有初始化式,编译器生成的代码也将wheels的存储值设置为4。

函数中的局部变量具有自动存储时间,这通常意味着它们是在函数的堆栈帧中分配的。

如果您编译代码并查看生成的程序集,您将看到SP被调整,以便为初始化的Carmodelwheels腾出空间。您还将看到std::string::~string()main的末尾被调用,作为Car默认析构函数剩余部分的一部分。

我实际上很失望,没有一个编译器(gcc, clang, icc)指出,你只访问A.wheels,A.wheels是4,std::string的析构函数没有副作用,因为他们知道构造函数是一个NOP,并为空字符串分配任何东西。

我希望优化器完全优化掉Car,只留下std::cout << 4;

相关内容

  • 没有找到相关文章

最新更新