【问题标题】:C++ Custom memory management using brk() system call to allocate memory?使用 brk() 系统调用分配内存的 C++ 自定义内存管理?
【发布时间】: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


【解决方案1】:

使用brk 可能会干扰常规的 C/C++ 内存分配器。即使您没有在代码中使用常规的newmalloc(),它也可能在库中使用。

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

【讨论】:

  • 干扰常规 C/C++ 内存分配器是什么意思?我并不怀疑——只是想了解您的意思/正在发生的事情。
  • malloc 可能假设它是唯一调用brk 的代码,因此其中的所有内容都有自己的堆。
  • 哦,我明白了——所以如果我没有其他堆分配的内存,但如果我通过 malloc/new 在堆上分配其他对象,我可能会遇到问题?
  • 对。就像我们说的,如果你调用任何库函数,它们可能会在堆上分配。
  • 例如Boost库等
猜你喜欢
  • 2018-09-05
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多