C++ 自定义内存管理使用 brk() 系统调用分配内存?

标签 c++ c linux memory-management linux-kernel

我写了一个基本的自定义内存管理分配器,它会获取一 block 内存,预先创建 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 可能会干扰常规的 C/C++ 内存分配器。即使您不在代码中使用常规的 newmalloc(),它也可能在库中使用。

如果您想管理自己的内存,请在/dev/zero 上使用mmap() 来获取一个空的内存块。我认为您可以重复执行此操作以获得新 block 。

关于C++ 自定义内存管理使用 brk() 系统调用分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20864740/

相关文章:

c & 海湾合作委员会 : Stack growth and alignment - for a 64 bit machine

linux - 提取一些不合规矩的信息

c++ - 你能解释一下指针和递归结构吗

c++ - 将仿函数作为函数指针传递

c - 如何显示字符数组?

c - C 中数据包的读/写处理示例

c - 算法问题——判断数组是否已经分区(即快速排序的一步)

c++ - execvp 无法运行新程序

c++ - 如何在 C++11 中操作日期/日期时间?

c++ - 增加类指针数组