我听说std :: vector很好,因为它保证连续分配内存(缓存友好)。那么像这样的顺序“新”运营商呢?连续的'新'操作符是否连续分配内存?
{
new Test1();
new Test2();
new Test3();
}
它不会使堆上的连续分配内存?
我听说std :: vector很好,因为它保证连续分配内存(缓存友好)。那么像这样的顺序“新”运营商呢?连续的'新'操作符是否连续分配内存?
{
new Test1();
new Test2();
new Test3();
}
它不会使堆上的连续分配内存?
连续new
表达式不一定分配连续的内存块。
但是C++ 14具有用于new
表达式,其中,在一定条件下它们可以与单个new
表达(即不一定分配足够大的块的连续内存)代替这样的序列的特殊支持,并且其中相应的delete
表达式被替换为单个delete
表达式。
”实现是允许省略一个呼叫到一个可更换的全球分配函数(18.6.1.1,18.6.1.2 )。当它这样做时,存储由实现提供,或者通过扩展另一个
new
表达式的分配来提供。实现可扩展的new
-expressione1
配置提供了new
-expressione2
存储,如果以下情况是真实的被分配不延长:
- 的e1
评价是e2
评估之前测序,并
-e2
评价每当e1
获得存储,并
- 既e1
和e2
调用相同的可更换的全球分配的功能,并
- 如果通过e1
和e2
调用分配函数是投掷,任何抗辩在任e1
或e2
将首先被夹在相同的处理程序,并
评价抛出NS - 通过e1
产生的指针值和e2
是操作数来评价delete
-expressions,并
- 的e2
评价之前测序delete
表达式的评估 - 其操作数是由e1
生成的指针值。
内存管理是真的取决于操作系统 - 在运行时,这等同于调用C malloc
功能几次连续的,即相邻的分配,不能保证(虽然可能)。为了保证对象存储在连续的内存块中,它们应该保存在一个数组中。
我不确定你想要的是什么应用程序,但是在大多数情况下,从缓存友好性提高速度远远超过传递物体的开销。缓存友好性只会加速在大型数据库上运行的程序(例如,长阵列的合并),因为CPU不需要快速将数组缓存到缓存中和缓存中 - 但是,对于少量的对象,不必担心缓存,因为它的影响会非常小。如果你是单独声明每个向量,而不是数组中的块,我猜测它们并不是那么多,因此不需要将它们放入数组中,并且不会加速程序。
在大多数实现中,分配器会保存以前的free'd内存,您不会指望总是获得连续的内存。
想想这种情况:Test1
是一个大对象,Test2
是小的一个,Test3
是一个中等大小。
当你为Test1
分配时,当前内存池没有足够大的可重用内存,所以它请求扩展堆并从那里分配。 然后你为小Test2
做,这只是一个微小的对象,有从以前free'd一个可重复使用的内存,所以你从该池中获得Test2
。
对于Test3
其类似于Test2
,但对于性能分配器将保持不同尺寸范围内的多个池,因此Test3
Test2
后可能不会去。
注意:所有这些在规范中都不是强制性的,它取决于实现,这里提出的只是通常的实现之一(进一步阅读:Buddy内存分配)。