【问题标题】:Dynamically Allocate Memory without Malloc不使用 Malloc 动态分配内存
【发布时间】:2013-11-20 22:51:18
【问题描述】:

我的任务是动态管理内存以超越 malloc 的速度。一些要求:

1) 有一个指向结构体的指针

2) 使用“块”内存

3) 内存将通过类似调用进行分配

init(memory * mem, int chunk_size, int num_chunks)

4) 内存指针将被全局声明。

5) 不使用系统调用

所以,我想过让我的结构只是:

typdef struct {
  char *byte;
} memory;

然后这会让我的 init 函数执行以下操作:

mem = new memory[chunk_size * num_chunks];

我不知道你是否可以在 C 中做到这一点——通常我会使用 malloc!然后释放我是否能够将指针设置为空?

感谢您的帮助!

【问题讨论】:

  • malloc 系列函数动态内存分配的标准接口。您将使用它们(或某些特定于操作系统的等效项)一次来获取内存池,然后稍后在该池上使用您的分配器。除非你被明确告知不要太打电话给malloc 来获得游泳池,否则你会让这件事变得更难。
  • 是的。关键是让它变得比它需要的更难。没有系统调用——希望能减少开销。
  • 希望你的分配器是线程安全的吗?
  • 目前,线程安全不是问题。
  • 设置一个unsigned char的喇叭大数组,静态存储范围(即在文件范围内声明或使用关键字static)作为您的“堆”,然后构建某种数据结构索引到它。

标签: c memory-management operating-system


【解决方案1】:

您可以使用系统调用来实现您自己的“malloc”版本以进行进程内存管理... 尝试 brk、sbrk 和 mmap 系统调用从内核获取内存...

这有一个易于理解的实现,您可以实现和改进

http://www.inf.udec.cl/~leo/Malloc_tutorial.pdf

【讨论】:

  • 这些操作虽然代价高昂,但如果您要实现自己的内存分配方案,则需要处理分配内存碎片等问题
  • 此处提供的链接已失效!
  • @ssp4all 更新link
【解决方案2】:

不,new 在 C 中不受支持,并且将指针设置为 null 不会释放相关的内存。事实上,这是泄漏内存的好方法。

这取决于您尝试执行的操作的详细信息,但通常您会先调用 malloc() 以获取较大的内存块,然后编写用于管理的自定义函数从程序中的那个大块分配。

如果您根本不想使用malloc(),则必须使用操作系统的内存分配调用之一。例如,在 Windows 下,您可能会调用 HeapAlloc()GlobalAlloc()。在 UNIX 系统上,您可以调用 brk()sbrk()

【讨论】:

  • malloc 速度的问题在于系统调用。他们的开销太大了。
  • 您必须以某种方式从操作系统获取内存,这需要系统调用。我认为查尔斯的建议是您只进行一次系统调用,因此开销无关紧要。然后,您的函数就可以在该单个系统调用分配的块内工作。
  • 没有办法绕过至少一个系统调用来获取初始内存块。一次调用 malloc() 不会影响性能,您只是想避免重复调用。如果您的内存要求有限,您也许可以使用 alloca() 在堆栈上分配内存,但这是非标准的,并且不会提供太多空间(通常是几兆字节或更少)。
猜你喜欢
  • 2022-11-10
  • 2020-11-12
  • 2018-10-16
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2012-04-29
相关资源
最近更新 更多