是否可以在C中编写一个符合malloc的实现?

这是Can a char array be used with any data type?的跟进

我知道动态内存和malloc的常见实现,参考可以在wikipedia找到.我还知道,malloc返回的指针可以被转换为程序员想要的任何指令,甚至没有警告,因为6.3.2.3指针中的标准状态1

A pointer to void may be converted to or from a pointer to any incomplete or object
type. A pointer to any incomplete or object type may be converted to a pointer to void
and back again; the result shall compare equal to the original pointer.

问题是假设我有一个没有malloc和free的独立环境,我该如何建立一致的C这两个功能的实现?

如果我对标准采取一些自由,很容易:

>从一个大字符数组开始
>使用相当大的对齐(8应该足以满足许多架构)
>实现一个从该数组返回地址的算法,在该对齐中跟踪已分配的内容 – 可以在malloc implementation?中找到很好的例子

问题是,该实现返回的指针的有效类型仍将是char *

标准在同一段第7段中说

A pointer to an object or incomplete type may be converted to a pointer to a different
object or incomplete type. If the resulting pointer is not correctly aligned for the
pointed-to type, the behavior is undefined. Otherwise, when converted back again, the
result shall compare equal to the original pointer.

这似乎不允许我假装所宣称的简单字符可以神奇地包含另一种类型,甚至不同类型在该阵列的不同部分或不同的时刻在同一部分.说不同地引用这样的指针似乎是未定义的行为,严格的标准解释.这就是为什么常见的成语使用memcpy而不是别名来获取字符串缓冲区中的对象的字节表示,例如当您从网络流读取它时.

那么如何在纯C中构建一个符合malloc的实现?

C标准的作者更加努力地指定行为,这些行为并不明显比那些更为明显,因为他们希望明智的编译器作者将支持有用的行为,无论标准是否规定了这一点,而且由于钝的编译器作者可以产生“兼容”的实现完全符合但完全无用(*).

在C89出现之前,可以在许多平台上编写可靠和高效的malloc()等效文档,我看不出有理由相信作者打算让一个能够处理malloc()的平台编写C89编译器的人,以前不会使这些实现与前辈一样能力.不幸的是,20世纪90年代流行的语言(它是C89及其前身的组合超集)已经被一种低质量的方言所取代,这种方言省略了C89作者理所当然的理由,并期望别人也这么做.

甚至超出了如何获得记忆的问题,更大的问题就是这样
malloc()承诺新分配的内存将处于最坏状态
不确定价值因为结构类型没有陷阱表示,
使用结构类型的指针读取这样的存储将被定义
行为.如果以前使用其他类型写入内存,
然而,结构类型读取将具有未定义的行为,除非有
free()或malloc()实际上会擦除所有存储空间,
从而否定了malloc()而不仅仅是性能优势
释放calloc().

(*)如果存在至少一组源文件,该实现以符合的方式处理而没有UB,则当给定任何其他源文件集合时,实现可能需要任意(可能不大)的堆栈空间量,并且行为如果该空间不可用,任意方式.

翻译自:https://stackoverflow.com/questions/38515179/is-it-possible-to-write-a-conformant-implementation-of-malloc-in-c

转载注明原文:是否可以在C中编写一个符合malloc的实现?