在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;
}
答案 0 :(得分:5)
结构的存储方式与类的存储方式之间没有(必要的)差异。事实上,C ++中结构和类之间的唯一区别在于,默认情况下结构成员是公共的,默认情况下类成员是私有的。
与任何其他类型的对象一样,类或结构类型的对象具有存储持续时间,这取决于它是如何创建的。
在函数内声明的对象的生命周期限于封闭块;这通常通过将其存储在堆栈中来实现。
在函数外部或使用static
关键字声明的对象具有在整个程序执行期间延伸的生命周期;这可以通过将其存储在数据段中来实现。
由new
运算符(或malloc()
调用)分配的对象存在,直到delete
d(或free()
ed)为止;这些对象在“免费商店”中分配,有时非正式地称为“堆”。
答案 1 :(得分:3)
实现类/结构的代码(即实现类型的代码)存储在代码段中的某个位置。
修改强>
正如OP在评论中澄清的那样,他的问题的答案从下面开始。 Q中有一个含糊不清的地方,这导致了这个答案的开场陈述。
根据您创建对象的方式,如果使用malloc
,new
创建或在本地堆栈存储上创建,则会在动态存储(freestore)上创建它们。
此外,它取决于创建对象的位置 全球范围的物体和静态对象在数据段或BSS段上创建。
AFAIK C ++标准没有提到内存段(freestore(aka堆)和本地存储(aka stack)除外)。所以实际上休息是一个实现细节。
答案 2 :(得分:1)
afaik,在不使用“new”运算符的情况下初始化的类/结构体存储在堆栈中,使用“new”创建的类存储在堆上。
答案 3 :(得分:0)
C ++有三个分配类:自动,动态和静态,连接到对象生命周期(分别是作用域,手动和永久)。通常,自动分配的对象实现为放置在堆栈上,而动态分配的对象进入堆栈;在一起,堆栈和堆包含程序的“堆栈段”。该程序(通常)也有一个“数据段”,这是静态分配的对象所在的位置 - 将加载时的静态分配视为发生,以便在程序正常开始之前将存储器放在一边。数据段可能包含只读部分,您可以在其中找到一些字符串常量(因此不要写入它们)。
当然,所有这些都是实现细节,并且这些都不是语言规定的。它只是桌面平台上的一种流行实现。
因此无论某个东西是类,结构还是整数,这都是无关紧要的,重要的是你如何分配它。
答案 4 :(得分:-1)
当自动创建类或结构时,它们存储在堆栈中。当它们动态创建时,它们存储在堆中。