动态地在一个可以一次性丢弃的区域中构造对象
Dynamically constructing objects in an area that can be discarded all at once
为了构建一个类似缓存的数据结构,我想做以下事情:
我想有一个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中赋值。如果对缓存中的所有数据结构都这样做,它将始终使用相同的连续内存。(我没有编译代码,所以可能有一些不同的语义)
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 错误:创建对象后无法分配区域
- 具有公共内存区域的类似数组的对象
- OpenglGL - 如何检查光标是否与对象区域重合?
- 跨越多个函数/对象的OpenMP并行区域
- 使用感兴趣区域的等值线进行对象检测
- C++圆形区域中的 Opencv 对象检测
- 使用cvMoments的对象区域
- 动态地在一个可以一次性丢弃的区域中构造对象
- 使一个对象可点击(如果鼠标在对象区域内,点击)