gpt4 book ai didi

c - malloc 内存分配的替代方案作为堆栈

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:09 30 4
gpt4 key购买 nike

我正在寻找 cma​​lloc 替代方案,它只会用作堆栈。更像是 alloca 但不受堆栈大小的空间限制。它用于编写数学算法。

  • 我将使用大量内存(算法中间可能使用数百兆字节)
  • 内存以类似堆栈的顺序访问。我的意思是下一个要释放的内存总是最近分配的内存。
  • 希望能够运行各种系统(Windows 和类 Unix)
  • 作为一个额外的东西,可以与线程一起使用的东西,其中类似堆栈的分配和释放顺序仅适用于单个线程。 (即理想情况下,每个线程都有自己的内存分配“池”)

我的问题是,是否有类似的东西,或者这是否易于实现?

最佳答案

这听起来像是 Obstack 的完美用法.

我自己从未使用过它,因为 API 真的很困惑,而且我现在无法找到示例。但它支持你想要的所有操作,另外还支持流式创建“当前”对象。

编辑:举了一个简单的例子。 Obstack API 有岁月痕迹,但原则至少是合理的。

您可能想要研究调整对齐/ block 设置,并且可能会使用 obstack_next_freeobstack_object_size 如果您想要进行任何花式种植。

#include <obstack.h>
#include <stdio.h>
#include <stdlib.h>

void *xmalloc(size_t size)
{
void *rv = malloc(size);
if (rv == NULL)
abort();
return rv;
}

#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free

const char *cat(struct obstack *obstack_ptr, const char *dir, const char *file)
{
obstack_grow(obstack_ptr, dir, strlen(dir));
obstack_1grow(obstack_ptr, '/');
obstack_grow0(obstack_ptr, file, strlen(file));
return obstack_finish(obstack_ptr);
}

int main()
{
struct obstack main_stack;
obstack_init(&main_stack);
const char *cat1 = cat(&main_stack, "dir1", "file1");
const char *cat2 = cat(&main_stack, "dir1", "file2");
const char *cat3 = cat(&main_stack, "dir2", "file3");
puts(cat1);
puts(cat2);
puts(cat3);
obstack_free(&main_stack, cat2);
// cat2 and cat3 both freed, cat1 still valid
}

关于c - malloc 内存分配的替代方案作为堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217191/

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