用new创建的对象是否保证保留在相同的内存位置?如果是这样,新的地方是否可以最大限度地减少缓存未命中和碎片?

问题描述 投票:0回答:1

举例来说,我用 new 创建一个向量,如下所示:

std::vector<int>* pointer_to_vector = new std::vector<int>{2, 4, 6, -1};

只要我不在向量上调用删除,pointer_to_vector 对于程序的其余部分是否保持有效(不是悬空)?换句话说,该对象会在内存中自行移动吗?

我知道向量的内容可以在内存中移动,但我对向量对象本身感兴趣。

如果用 new 创建的对象本身不会在内存中移动,并且您扩展程序来创建大量对象,那么 new 是否会将它们紧密地放置在一起以最大限度地减少缓存未命中和内存碎片,或者它们是否可以分散在远处?

我也知道,如果你想精确控制对象在内存中创建的位置,你可以使用placement new,但我想知道new如何自动处理这个问题。

c++ caching dynamic-memory-allocation new-operator memory-fragmentation
1个回答
0
投票

用 new 创建的对象是否保证保留在相同的内存位置?

是的。

或更具体地说,像您的 pointer_to_vector 这样的

pointer
标识内存位置。 在所指向对象的生命周期内,您的指针永远不会变得不正确

新的方法是否将它们放置在一起以最大限度地减少缓存未命中和内存碎片,或者它们是否可以分散在远处?

C++ 语言不保证多次调用 new 的“局部性”。 这种行为通常是由特定的操作系统决定的,而不是由语言决定的。 但是,

new

的常见实现通常保证在连续调用 new 提供的内存之间始终存在“一些空间”。

如果您希望多个对象靠近在一起以进行缓存,则应该对 

new

进行一次调用来分配所有这些对象。

    

© www.soinside.com 2019 - 2024. All rights reserved.