gpt4 book ai didi

c++ - C++ 中(类的)对象存储在哪里(在哪个内存段)?

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:40 24 4
gpt4 key购买 nike

我们以下面的类为例

class Shape{
public:
Circle (int x): number(x){}
virtual area () {return x**2;}

private:
int number;
}

主要我们创建对象

int main(){
Shape *foo = new Shape(8);
Shape *bar = new Shape(65);
Shape &obj1 = *foo, &obj2 = *bar;
}

我相信对象 1 和 2 存储在堆中。这是为什么?作为附带问题。关键字 virtual 或/和对象的定义方式(例如 obj1 = *foo)是否会影响其在内存中的定位?

最佳答案

(大体上)有两种类型的对象 W.R.T.他们的内存管理:

  1. 一个对象可以在编译时完全构造
  2. 一个对象只能使用一些直到程序运行后才可用的信息来完全构造

例如,任何 constexpr 类型的对象都可以在编译期间被完全评估和构造,因此可以作为优化放入内存数据段(从纯粹的角度来看,它是一个有效的,但远非最佳,在运行时构造此类对象。但这会浪费 CPU 周期并使初始化/启动时间更长)。

以下是此类对象的一些示例:

const char * const helloWorld = "Hello, world!";
struct TSilly{
TSilly(int _i = 0) : i(_i) {}
int i;
};
const TSilly silly1;
const TSilly silly2(42);
TSilly silly3; // doesn't have to be constexpr to qualify for static allocation.
// This one you can declare as /*extern TSilly silly3;*/ in
// header file and access from other compilation units
static TSilly silly4; // can be local to compilation unit, too

int main()
{
return 0;
}

所有其他对象必须等到运行时才能构建。

此类对象的示例:

const char * exeName1; // statically allocated by compiler

int main(int argc, char **argv)
{
exeName1 = argv[0]; // now points to a string

// buffer is allocated in free storage (heap) bu variable itself is on stack
char * exeName2 = new char[strlen(argv[0] + 1];
strcpy(exeName2, argv[0]); // now contains a COPY of a string

char exeName3[1024]; // likely allocated on stack, be careful with that as stack space is limited
strncpy(exeName3, argv[0], 1024); // will COPY at most 1023 characters from a string

delete [] exeName2; // don't forget to clean up
// exename3 will be auto-cleaned when we exit the function

return 0;
}

如您所见,C++ 中的对象将根据其生命周期放入数据段或空闲存储空间(堆)。

只有动态分配 对象才能保证放入空闲存储空间。我认为该规范并未 promise 为静态分配 对象使用数据段 - 这取决于编译器来执行和利用该优化。

有关更多信息,请谷歌“C++ 存储类”。

您可能想要研究许多高级内存管理主题。与此讨论最相关的可能是就地构造函数,它允许您在分配给可执行文件的数据段的内存中构造一个运行时对象。

关于c++ - C++ 中(类的)对象存储在哪里(在哪个内存段)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513625/

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