【问题标题】:Is there a way to allocate memory from a specific memory location?有没有办法从特定的内存位置分配内存?
【发布时间】:2014-10-27 05:33:19
【问题描述】:

让我用一个例子来解释一下: 假设我们想要调整之前动态分配的对象数组的大小...... 所以我们有这样的解决方案:
创建一个具有新大小的新数组并尝试将旧数组复制到该数组并尝试释放旧数组...

但我想要的是在数组之后检查内存是否有可用空间,如果它存在为我的数组分配内存,而不是防止内存开销!另一方面,如果我们的新数组没有足够的内存和旧数组同时,我们无法调整它的大小!
有没有办法从特定的内存位置分配内存?

【问题讨论】:

  • 你的例子会更好一些代码,甚至伪代码。就目前而言,听起来您只是想使用std::vector
  • 不,我想自己做,而不是像vector这样的C++标准类
  • 然后展示你希望这样的东西如何在代码中工作,正如我所提到的,仅用文本很难理解你在问什么。
  • ok 看看这个: bool resize(stuff *input){ if(Is_memory_free(from:input.last(), to:input.last() + sizeof(one block of input))) void *newmemory = allocate_memory(from:input.last(), to:input.last() + sizeof(一个输入块)) attach_to_array(old_memory:input, new__memory:newmemory) else return false return true }
  • 查看 realloc 和下面提到的新位置

标签: c++ memory


【解决方案1】:

您可能需要placement new,它实际上将您的对象“放置/构造”在特定的内存地址中。 Placement new 分配内存,您应该为对象手动调用析构函数。有以下语法

char memory[sizeof(Fred)];   // allocate a block of memory with sizeof(Fred)  
void* place = memory;          
Fred* f = new(place) Fred();
// The pointers f and place will be equal 

f->~Fred(); // explicitly delete the object *not* the memory block.

除非您知道自己在做什么,否则不要使用 Placement new。例如,您确信可以提高性能的专用内存分配器。例如在游戏中经常会创建内存池,其中会不断创建和删除许多对象,您可以分配特定大小的内存块,然后构造和删除对象(重用内存块)。

【讨论】:

    【解决方案2】:

    我猜你想要placement new 运算符。另请阅读 operator new 文档、C++ memory management,并考虑使用专门的 Allocators

    【讨论】:

      【解决方案3】:

      当我提出这个问题时,我的回答是“不可能”,这引发了我对采访的回忆。

      确实,placement new 有很多用途,其中一种是将对象放置在内存中的特定位置。

      #include <new>        // >>>>>>>>>Must #include this to use "placement new"
      #include "abc.h"     // Declaration of class Abc.
      
      void someCode()
      {
        char memory[sizeof(Abc)];     
        void* place = memory;          
      
        Abc* f = new(place) Abc();   
        // The pointers f and place will be equal  <<<< CAUTION OVER HERE
      
        ...
      }
      

      【讨论】:

        【解决方案4】:

        如果您需要避免数组移动,而我能想到的唯一充分理由是数组需要对它进行无锁多线程访问,您最好首先分配它并使用mmap 保留地址空间,这将总是足够了。假设您使用的是 64 位操作系统,地址空间实际上是无限的。 malloc 可能在 linux 上工作,具体取决于您的过度使用设置,新的不能用于执行此操作,因为构造函数将访问数据并耗尽您的所有内存。

        【讨论】:

        • 实际上,::operator new(num_bytes) 可以很好地用于内存分配,您不必包含 &lt;cstdlib&gt; 即可使用它。
        • @CoffeeandCode 并非在所有平台上都是如此。 Solaris 和朋友永远不会使用 new 或 malloc 过度使用,Linux 可能会也可能不会取决于过度使用设置。此外,当读取、更新或分配内存时,mmaped 内存保证为 0,这是未定义的行为 - 大不,不。此外,如果你 new this,如果你试图过度使用,你不能使用构造函数,否则内存将被写入。
        • 我认为我第一次没有正确阅读您的答案。你是对的; new 可能永远不会过度使用,我也不会依赖 malloc
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        • 2018-04-02
        • 2019-10-03
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多