动态地在一个可以一次性丢弃的区域中构造对象

Dynamically constructing objects in an area that can be discarded all at once

本文关键字:区域 对象 一次性 一个 动态      更新时间:2023-10-16

为了构建一个类似缓存的数据结构,我想做以下事情:

我想有一个class Cache构建和管理一些数据结构在内存的某个区域预定义的大小。

为了构建数据结构,Cache类应该能够使用标准类,例如vector。现在,由Cache类(直接或间接)动态分配的所有对象都应该进入内存中的预定义区域,我希望能够通过简单地将其归零(或忘记它)来立即丢弃所有对象(即不破坏每个单独的对象)。我知道这是违反标准的。

我想到了下面的方法:

alter_operator_new_to_allocate_everything_within_my_cache_area ();
cache.cacheMyObjects (...);
alter_operator_new_into_normal_behaviour ();

问题:

  • 是否描述了这种方法或类似问题的解决方案任何地方?
  • 这能行吗?
  • 或者有更好的解决方案来解决我的问题?

当然,我也可以尝试从头开始编写缓存类,这样它就只使用POD数据结构,但在许多情况下,这将意味着重新发明轮子。

我只需要一个解决方案,适用于VS2013/2015和Windows。

我相信您想要解决的问题可以通过自定义分配器来解决。

您可以预先分配缓存所需的大块连续内存。然后,您可以定义一个自定义分配器对象,以便始终从该内存块进行分配。然后将该分配器对象传递给std::vector或任何其他数据结构[参见http://www.cplusplus.com/reference/vector/vector/,第二个模板参数]。

分配器类必须实现allocator_traits中声明的成员:http://en.cppreference.com/w/cpp/memory/allocator_traits

的例子:

class my_allocator {
   void* memory_block;
   my_allocator() { memory_block = malloc( ... ); }
   ~my_allocator() { free(memory_block); }
   void* allocate(..) { ..assign from memory_block.. } 
};
class Cache {
    my_allocator my_alloc;
    std::vector< int, my_alloc > my_vector;
    ..other data..
};
从此以后,vector总是从memory_block中赋值。如果对缓存中的所有数据结构都这样做,它将始终使用相同的连续内存。(我没有编译代码,所以可能有一些不同的语义)