繁体   English   中英

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

[英]Where are stored structs and classes written in C++?

在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;
}

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

与任何其他类型的对象一样,类或结构类型的对象具有存储持续时间 ,该持续时间由其创建方式决定。

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM