【发布时间】:2017-10-20 06:57:52
【问题描述】:
如果我想分配未知大小的动态内存部分,或者更确切地说是在运行时已知的大小,在用户输入他想要分配的兆字节数之后,例如,最好的方法是什么?去做?是否从 C 中调用“malloc”,要求操作系统为我这样做?或者,还有更好的方法? 通常是怎么做的?
注意我不想预订
【问题讨论】:
-
调用 malloc 或 mmap,就像你从 C 中一样,或者像 C 编译器在它从你的 C 生成的 asm 中所做的那样。(或
realloc/calloc/aligned_alloc/随便。)最好的方法取决于你在做什么。 -
malloc是 C 库中的一个函数。如果您不想将其链接到您的程序,您可以使用通常为sbrk或mmap的底层系统调用。但是您的问题缺乏上下文,无法在本网站上被接受。 -
相关非 Linux 示例:avr-libc(用于在 8 位 RISC AVR 架构上运行的裸机程序)实现 malloc this way。有关分配器如何工作和管理其空闲列表的信息,请参阅最后的“实现细节”部分。您当然可以在 Linux(在任何架构上)的用户空间中执行类似的操作如果您想实现自己的分配器。但通常没有理由这样做,只需致电
aligned_alloc。尽管通常任何值得在 asm 中编写以实现高性能的循环都避免了动态分配。 -
即“通常如何完成”的答案:根本不是来自asm。仅在 asm 中编写代码中真正对性能至关重要的部分。例如,请参阅
x264或ffmpeg,其中大部分代码是用 C 语言编写的,只有少数 SIMD 或其他函数是用 asm 手写的。 -
在我们用汇编语言编写应用程序的时候,PC-DOS 是一个单用户系统,默认情况下你会获得所有内存。所以这不是问题。现在我会用 C 或其他语言编写主程序,设置环境,然后可能调用一些程序集来完成非常专门的任务。从汇编调用
malloc并不比从C 调用它快,只是更难。
标签: linux assembly memory-management