【发布时间】:2014-01-18 19:49:42
【问题描述】:
我写了一个基本的自定义内存管理分配器,它会抓取一块内存,预先创建 X 对象,这样每当我需要“创建”一个对象时,我就可以抓取一个预先创建的对象并简单地分配数据成员(内存已分配)。
我用placement-new:
//Grab a chunk of memory
char* buf = new char [sizeof(X) * num_objs];
//Pre-create a lot of objects
for(std::int64_t i=0; i<num_objs; i++){
char* c = buf + (sizeof(X) * i);
//This line creates the Order object at location c
X* x = new(c)X;
}
//Assign data members to objects
for(std::int64_t i=0; i<num_objs; i++){
char* buf_loc = buf + (sizeof(X) * i);
X* my_x = reinterpret_cast <X*> (buf_loc);
my_x->a = 1;
my_x->b = 2;
my_x->c = 3;
my_x->d = 4;
}
更改上述内容并使用brk()直接从操作系统中获取内存有多容易/实用?
【问题讨论】:
-
如果您要自己搞乱
brk,那么很可能libstdc++ / libc 将无法正常工作(它们依赖于工作的malloc)。你还好吗? -
不要使用
brk,而是在/dev/zero上使用mmap()来获得一块内存。 stackoverflow.com/questions/8507945/mmap-with-dev-zero -
@Barmar 我查看了 mmap() 与 brk() 的区别,似乎不同之处在于 mmap() 可以分配在不同的位置(brk 不能)但比 brk() 慢?
-
@GuilhermeBernal 我不明白你所说的它会“乱来”是什么意思?你这是什么意思/为什么会干扰?
标签: c++ c linux memory-management linux-kernel