gpt4 book ai didi

c++ - 堆上某个类的成员变量存储在哪里?

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

作为一个类在堆上实例化。那么所有成员变量是否也分配在堆上或其他地方。那么在堆上显式分配成员变量有什么好处吗?

struct abc {
std::vector<int> vec;
}


int main() {
abc* ptr = new abc(); //the "class" is on the heap but where is vec?
ptr->vec.push_back(42); //where will the 42 be stored?
return 0;
}

这会有什么不同

struct abc {
std::vector<int>* vec_ptr;
abc() { vec_ptr = nev std::vector<int>(); }

int main() {
abc* ptr = new abc();
ptr->vec->push_back(42);
}

最佳答案

非静态数据成员存储在它们所属的对象(类实例)中。

如果你创建一个对象作为具有自动存储持续时间的本地对象,它的成员是在里面。如果你动态分配一个对象,它们就在里面。如果你使用一些完全不同的分配方案分配一个对象,它的成员将仍然在它里面,无论它在哪里。对象的成员是该对象的部分

请注意,此处的 vector 实例位于您的结构内部,但 vector 本身为您推送到其中的项目管理自己的动态存储。因此,abc 实例在通常的免费存储中动态分配,其中包含其 vector 成员,而 42 在单独的动态分配管理中通过 vector 实例。

例如,vector 是这样实现的:

template <typename T, typename Allocator = std::allocator<T>>
class vector {
T *data_ = nullptr;
size_t capacity_ = 0;
size_t used_ = 0;
// ...
};

然后 capacity_used_ 都是 vector 对象的一部分。 data_ 指针 也是对象的一部分,但是内存由 vector 管理(并且指向 data_) 不是。


术语说明:

  • 具有自动存储持续时间 最初是在堆栈上。正如 Loki(和我 mentioned myself elsewhere)指出的那样,自动本地存储通常是使用调用堆栈实现的,但这是一个实现细节。
  • 动态 最初是在堆上 - 同样的反对意见适用。
  • 当我说普通免费商店时,我只是指::operator new 管理的任何资源。里面可能有任何东西,这是另一个实现细节。

关于c++ - 堆上某个类的成员变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626350/

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