存储的结构和用C ++编写的类在哪里?

时间:2011-08-26 20:17:51

标签: c# c++ class struct stack

在C#中,类存储在堆中,而结构存储在堆栈中。

在C ++类和strucs中是否以相同的方式存储(假设我静态地创建了我的类和结构,并且每个类或结构的成员都没有被new分配)?

请使用下面的代码片段解释一下:

class B
{
int b;
}

class C
{
int c;
}

class A
{
B b;
C c;
int x;
}

struct SB
{
int sb;
}

struct SC
{
int sc;
}

struct SA
{
SB sb;
SC sc;
int x;
}

void main()
{
A a1;
A *a2 = new A;

SA sa1;
SA *sa2 = new SA;
}

5 个答案:

答案 0 :(得分:5)

结构的存储方式与类的存储方式之间没有(必要的)差异。事实上,C ++中结构和类之间的唯一区别在于,默认情况下结构成员是公共的,默认情况下类成员是私有的。

与任何其他类型的对象一样,类或结构类型的对象具有存储持续时间,这取决于它是如何创建的。

在函数内声明的对象的生命周期限于封闭块;这通常通过将其存储在堆栈中来实现。

在函数外部或使用static关键字声明的对象具有在整个程序执行期间延伸的生命周期;这可以通过将其存储在数据段中来实现。

new运算符(或malloc()调用)分配的对象存在,直到delete d(或free() ed)为止;这些对象在“免费商店”中分配,有时非正式地称为“堆”。

答案 1 :(得分:3)

实现类/结构的代码(即实现类型的代码)存储在代码段中的某个位置。

修改
正如OP在评论中澄清的那样,他的问题的答案从下面开始。 Q中有一个含糊不清的地方,这导致了这个答案的开场陈述。

根据您创建对象的方式,如果使用mallocnew创建或在本地堆栈存储上创建,则会在动态存储(freestore)上创建它们。

此外,它取决于创建对象的位置 全球范围的物体和静态对象在数据段或BSS段上创建。

AFAIK C ++标准没有提到内存段(freestore(aka堆)和本地存储(aka stack)除外)。所以实际上休息是一个实现细节。

答案 2 :(得分:1)

afaik,在不使用“new”运算符的情况下初始化的类/结构体存储在堆栈中,使用“new”创建的类存储在堆上。

答案 3 :(得分:0)

C ++有三个分配类:自动,动态和静态,连接到对象生命周期(分别是作用域,手动和永久)。通常,自动分配的对象实现为放置在堆栈上,而动态分配的对象进入堆栈;在一起,堆栈和堆包含程序的“堆栈段”。该程序(通常)也有一个“数据段”,这是静态分配的对象所在的位置 - 将加载时的静态分配视为发生,以便在程序正常开始之前将存储器放在一边。数据段可能包含只读部分,您可以在其中找到一些字符串常量(因此不要写入它们)。

当然,所有这些都是实现细节,并且这些都不是语言规定的。它只是桌面平台上的一种流行实现。

因此无论某个东西是类,结构还是整数,这都是无关紧要的,重要的是你如何分配它。

答案 4 :(得分:-1)

当自动创建类或结构时,它们存储在堆栈中。当它们动态创建时,它们存储在堆中。