2016-07-31 85 views

回答

3

连续new表达式不一定分配连续的内存块。

但是C++ 14具有用于new表达式,其中,在一定条件下它们可以与单个new表达(即不一定分配足够大的块的连续内存)代替这样的序列的特殊支持,并且其中相应的delete表达式被替换为单个delete表达式。

C++ 14(N3936草案)§5.3.4/ 10:

实现是允许省略一个呼叫到一个可更换的全球分配函数(18.6.1.1,18.6.1.2 )。当它这样做时,存储由实现提供,或者通过扩展另一个new表达式的分配来提供。实现可扩展的new -expression e1配置提供了new -expression e2存储,如果以下情况是真实的被分配不延长:
- 的e1评价是e2评估之前测序,并
- e2评价每当e1获得存储,并
- 既e1e2调用相同的可更换的全球分配的功能,并
- 如果通过e1e2调用分配函数是投掷,任何抗辩在任e1e2将首先被夹在相同的处理程序,并
评价抛出NS - 通过e1产生的指针值和e2是操作数来评价delete -expressions,并
- 的e2评价之前测序delete表达式的评估 - 其操作数是由e1生成的指针值。

0

内存管理是真的取决于操作系统 - 在运行时,这等同于调用C malloc功能几次连续的,即相邻的分配,不能保证(虽然可能)。为了保证对象存储在连续的内存块中,它们应该保存在一个数组中。

我不确定你想要的是什么应用程序,但是在大多数情况下,从缓存友好性提高速度远远超过传递物体的开销。缓存友好性只会加速在大型数据库上运行的程序(例如,长阵列的合并),因为CPU不需要快速将数组缓存到缓存中和缓存中 - 但是,对于少量的对象,不必担心缓存,因为它的影响会非常小。如果你是单独声明每个向量,而不是数组中的块,我猜测它们并不是那么多,因此不需要将它们放入数组中,并且不会加速程序。

0

在大多数实现中,分配器会保存以前的free'd内存,您不会指望总是获得连续的内存。

想想这种情况:Test1是一个大对象,Test2是小的一个,Test3是一个中等大小。

当你为Test1分配时,当前内存池没有足够大的可重用内存,所以它请求扩展堆并从那里分配。 然后你为小Test2做,这只是一个微小的对象,有从以前free'd一个可重复使用的内存,所以你从该池中获得Test2

对于Test3其类似于Test2,但对于性能分配器将保持不同尺寸范围内的多个池,因此Test3Test2后可能不会去。

注意:所有这些在规范中都不是强制性的,它取决于实现,这里提出的只是通常的实现之一(进一步阅读:Buddy内存分配)。