gpt4 book ai didi

c - 使用 mmap 和 munmap 实现你自己的 malloc/free

转载 作者:IT王子 更新时间:2023-10-29 00:15:52 29 4
gpt4 key购买 nike

我使用mmap 实现了自己的ma​​llocfree。现在由于与free不同,munmap也将长度作为参数,因此我将长度作为附加信息放在映射内存中。

我的 ma​​llocfree 的代码如下所示。我想问一下,如果这段代码很好,或者我是否仍然遗漏任何东西或以错误的方式做某事。

void * malloc ( size_t size )
{
int *plen;
int len = size + sizeof( size ); // Add sizeof( size ) for holding length.

plen = mmap( 0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );

*plen = len; // First 4 bytes contain length.
return (void*)(&plen[1]); // Memory that is after length variable.
}

void free ( void * ptr )
{
int *plen = (int*)ptr;
int len;

plen--; // Reach top of memory
len = *plen; // Read length

munmap( (void*)plen, len );
}

最佳答案

一些观察:

  • 您假设 intsize_t 具有相同的大小。如果您想在分配的头部存储一个 size_t 值,那么为什么不直接这样做呢?为什么要引入int
  • 这很可能在内存使用和速度方面都非常低效。 mmap() 有很大的开销,通常分配不能小于“页面”。大多数真正的分配器试图以各种方式避免在每个 malloc() 上调用操作系统级功能。
  • 如果 mmap() 失败,它将返回 MAP_FAILEDmalloc() 也应该如此。因此,您需要在取消引用 mmap() 返回的指针之前对其进行测试。
  • 调用free(NULL) 应该是一件有效的事情;对于您的实现,它很可能会导致崩溃,因为您没有NULL-在假设它有效之前检查参数。

关于c - 使用 mmap 和 munmap 实现你自己的 malloc/free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8475609/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com