代码之家  ›  专栏  ›  技术社区  ›  greenlagoon

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

  •  1
  • greenlagoon  · 技术社区  · 1 年前

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

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

    只要我不对向量调用delete,pointer_to_vector在程序的其余部分是否仍然有效(不悬空)?换句话说,物体会在记忆中自行移动吗?

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

    如果用new创建的对象不会自己在内存中移动,而你扩大程序以创建大量对象,new会将它们放在一起以尽量减少缓存丢失和内存碎片,还是可以将它们分散在远处?

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

    1 回复  |  直到 1 年前
        1
  •  2
  •   Drew Dormann    1 年前

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

    对。

    或者更具体地说,a 指针 喜欢你的 pointer_to_vector 标识存储器位置。在所指向对象的生命周期内,该内存位置永远不会成为 不正确的 .

    新方法是将它们放在一起以尽量减少缓存丢失和内存碎片,还是将它们分散在远处?

    C++语言不能保证 地点 多次致电新。这种行为通常由特定的操作系统决定,而不是由语言决定。

    然而,常见的实现方式 new 通常保证连续调用new所提供的内存之间总是有“一些空间”。

    如果你想让几个对象为了缓存而靠近在一起,你应该对以下对象进行一次调用 它分配所有这些对象。

    推荐文章