C 中的堆是否包含类和结构对象,或者仅包含指针

Does the heap in C++ contain classes and structure objects or does it just contain pointers?

本文关键字:对象 或者 指针 包含 结构 是否 包含类      更新时间:2023-10-16

我正在阅读Java中的对象在堆中,但是我想知道C 或任何编程语言是否也是如此。

heap 不是C 语言在此上下文中使用的单词。堆是操作系统提供的虚拟内存区域(从非常抽象的高级角度来看)。从C 中的 Free Store 分配的内存通常通过语言实现从堆中分配。那是一个实现细节。

C 中的堆是否包含类...

否。在C 中没有存储。它们不包含在内存中。

对象有存储。动态分配的对象存储在通常位于堆内存中的免费商店中。

...结构对象或仅包含指针?

指示器,就像类的实例(包括结构)一样,也是对象。就像其他类型的对象一样,指针也可以在动态,自动或静态(和其他)存储中分配。


我正在阅读Java中的对象在堆里,但是我想知道C 是否也是如此...

否。只有动态分配的对象"在堆中"(请注意,这是一个实现细节)。自动存储中的对象是"在堆栈上"(虚拟内存的另一个区域,另一个实现细节)。带有静态存储的对象位于内存的另一个区域。

鉴于该位置是实现细节,因此对象可能仅存在于处理器的寄存器中,而不是在内存中存在。

...或任何编程语言。

对于所有编程语言而言,这并不是普遍正确的。毕竟,我告诉过您,对于C 是不正确的。除C 外,还有其他语言具有不同的存储持续时间的概念。显然,C是另一个例子。

但是,您的语句确实适用了许多动态语言。

tl; dr in c in c ,变量直接存储在类似于java的东西中"堆栈",但它们可能作为实现细节,以类似于Java的" Heap"的数据分配的数据来支持。

我的答案仅适用于常见的C 实现,而不是语言本身(例如,我确定嵌入式系统完全不同)。我也忽略了动态存储持续时间(您使用newdelete关键字在C 中获得的内容),因为在大多数情况下,这并不是很有用。

在Java中,您有堆栈的想法。它具有原始内容,并且会引用类的实例化(我不会在这里使用"对象"一词,因为它在C 中的意思是非常不同的东西)。实际的类实例化位于其他地方:在堆上。Java中的==仅比较堆栈值并忽略堆值。

同时,在C 中,当您定义类时,例如

class Foo {
  double data;
  std::string more_data;
};

然后实例化

Foo foo = {5.0, "enough data to to prevent the short string optimization from happening"};

然后将两个Foo的数据成员直接放在"堆栈"上。表达式sizeof(Foo)将通过Foo的任何实例化需要多少"堆栈"存储器(请注意,它始终是相同的,并且是类型Foo的功能,并且在运行时不会有所不同)。

当然,Foostd::string数据成员可以处理任意尺寸的字符串。为此,典型的std::string实现将指向动态分配的内存块的指针。当Foo类型的变量与非空字符串实例化时,该块可能会分配,然后当该变量超出范围时(按std::string的destructor)进行处理(按照CC_12的destructor)。那就是你的"堆"。几乎所有需要存储在运行时变化的数据的东西都将使用"堆"。

在C 和C中,堆是一个抽象 - 包含(从概念上)内存区域。在C动态内存分配上读取Wikipage(其中大部分也适用于C )。在操作系统级别上,堆是由在运行时生长的虚拟地址空间中的几个段组成的(通过Linux上的MMAP(2)等系统调用,由malloc和/或::operator new间接调用。从理论上看

一个内存区域(可以在堆中,也可以在呼叫堆栈上) May 包含一个对象。它也可能包含其他一些聚合(例如数组)。它也可能包含垃圾(或所有这些的混合)。

有时,尚未初始化存储区,然后(当时)它包含垃圾。例如,::operator new的结果或malloc的结果可能是不可分化的。

相关且重要的概念是不确定的行为

重要的是对象的存储持续时间。自动变量是在概念上在呼叫堆栈上(不是在C 11标准N3337中提到),但是其中一些只是在实践中坐在处理器寄存器中(PERas-if规则)。在C 中阅读有关动态内存管理的更多信息。

Java和C 之间的一个重要区别是它们的内存管理。Java语言要求垃圾收集器。但是C 基于RAII,因此有利于参考计数(可以被视为某些不正确处理循环引用的糟糕的GC技术)和智能指针。

C 是A 非常困难的编程语言(即使我可以在C 中代码),我不声称掌握它。您需要数年才能学习C 。首先阅读一些好的C 编程书。另请参阅一些C 参考网站。

我相信,垃圾收集的术语和概念即使对C 程序员也很有用(因为在某些案例中,您最终将在您的应用程序中实现专门的GC;请注意Greenspun的第十个规则)。因此,请阅读GC手册。

所谓的堆是程序可以用于任何目的的内存。它用于实现对象,存储数据等。

相关文章: