C ++,Free-Store vs堆

dynamic分配与new/delete据说是在免费店
malloc/free操作使用

我想知道在实践中是否有实际的差异。
编译器是否区分这两个术语? ( 免费的商店 ,不是new/malloc

http://www.gotw.ca/gotw/009.htm ; 它可以比我更好地描述堆和免费店之间的差异:

免费店:

免费商店是两个dynamic存储区之一,由新/删除分配/释放。 对象的生存期可以less于分配存储的时间; 也就是说,自由存储对象可以在没有立即初始化的情况下分配内存,并且可以销毁而不会立即释放内存。 在存储被分配但在对象的生命周期之外的期间,存储可以通过void *被访问和操作,但是没有任何原始对象的非静态成员或成员函数可以被访问,获取其地址,或者以其他方式被操纵。

堆:

堆是另一个dynamic存储区,由malloc / free和它们的变体分配/释放。 请注意,虽然默认的全局新build和删除可能以malloc方式实现,并且由特定的编译器自由实现,但堆不同于自由存储区,在一个区域中分配的内存不能在另一个区域中安全释放。 从堆分配的内存可以用于类types的对象,通过放置 – 新构造和显式销毁。 如果这样使用,关于免费商店对象生命周期的注释在这里也适用。

对于C ++来说,免费商店和堆之间的区别已经变成了纯粹的概念。 就像收集错误的一个jar子,一个收集cookies一样。 一个被标记为一个方向,另一个被标记。 这个名称是为了让你回想起你永远不要把“new”和“delete”与“malloc”,“realloc”或“free”(或者这个事件的位级设置)混合在一起。

在采访期间可以这么说:“新build和删除使用免费商店,malloc和免费使用堆;新build和删除分别调用构造函数和析构函数,然而malloc和free不会。 然而,你会经常听到内存段真的在同一个区域 – 但是,可以是编译器特定的,也就是说,它们可以指定不同的内存空间作为池(不知道为什么,虽然)。

Mike Koval的回答很好地涵盖了这个理论。 然而,在实践中,它们几乎总是相同的内存区域 – 在大多数情况下,如果您深入了解编译器的new实现,您会发现它调用malloc()

换句话说:从机器的angular度来说,堆和免费存储是一回事。 区别存在于编译器内部。

为了让事情变得更加混乱,在C ++出现之前,我们称之为“堆”,意思是现在所谓的“自由存储”。

术语“堆”也可以指特定的数据结构,但是在C ++ malloc,free,new和delete操作的上下文中,术语“堆”和“自由存储”或多或less可以互换使用。

堆和自由存储不应该互操作。 在像AVR 8位微控制器和c ++ 11标准库一样的有限状态中,它们甚至不能用在同一个程序中。 自由存储和堆在同一个内存空间中进行分配,覆盖其他结构和数据。 在这种情况下,Free store与Heap不同,与Heap不兼容,因为“new / delete free store library”比“malloc / free / realloc / calloc heap library”更简单(也更快),因此提供了巨大的内存使用收益C ++embedded式程序员(在只有512字节RAM的情况下)。

https://github.com/ambroise-leclerc/ETL/tree/master/libstd查看8位c ++ 11/14标准库

除了像push_heap等的堆函数的描述之外,我不记得提到heap这个词的标准。 所有的dynamic分配都在免费店里进行。

Free Store是一个未分配的堆内存池,给程序执行过程中用于dynamic分配的程序。 每个程序都有一个未分配的堆内存池,可以在执行过程中使用。 这个可用内存池被称为程序的免费存储。 分配的免费商店内存是未命名的。