为我自己的 malloc 实现创建一个标志

Create a flag for my own malloc implementation

提问人:lordeji 提问时间:5/26/2023 更新时间:5/26/2023 访问量:52

问:

因此,正如我在标题中所说,我目前正在研究自己的动态内存分配系统实现。

问题是,因为我希望实现尽可能小,所以在内存中有一个特定的“标志”,该标志表示之后的内存被占用(+他的大小)

我在记忆中想象这样的事情:...... | flag | size | (start_of_array) | ......

我想使用像 SIZE_MAX 这样的大值,因为从技术上讲,它看起来像 64 个在内存中排列,我认为在内存中找到这个并不常见,但这并非不可能,因此这种技术容易出错......

有没有一种更安全的方法来做到这一点,并创造一个无论如何都不会被机器创造的价值?

提前致谢 !

C 内存 动态 malloc 标志

评论

5赞 Retired Ninja 5/26/2023
如果您必须扫描内存中的哨兵值才能弄清楚分配了什么,那么您做错了。
2赞 tadman 5/26/2023
命名一个“永远不会由计算机创建”的值。我敢打赌你不能。任何你能表达的东西都可能有用户记忆。我和 Ninja 在一起:不要混淆分配表和分配。有明确的分离。
0赞 John Bollinger 5/26/2023
大小字段是否足以让您遍历阻止列表?也许您希望标志来指示诸如块是否仍被分配以及它是否是列表中的最后一个之类的东西,但您首先不需要特殊值来识别块。
0赞 lordeji 5/26/2023
@RetiredNinja那怎么办呢?我找不到关于 malloc 实现的好信息......
0赞 Retired Ninja 5/26/2023
gee.cs.oswego.edu/dl/html/malloc.html 和搜索 dlmalloc 源代码应该会让你忙上一阵子。你可以很容易地找到 malloc gcc 和 llvm 使用的源代码。

答:

0赞 John Bollinger 5/26/2023 #1

有没有一种更安全的方法来做到这一点,并创造一个无论如何都不会被机器创造的价值?

不,除了分配器之外,您没有可以放心地假设不会放置在内存中的值。就其价值而言,这是一个特别糟糕的选择。它本身具有多种可能的用途,并且在相应的有符号整数类型中也具有与 -1 相同的表示形式,该类型具有自己的多种用途。SIZE_MAX

您不需要使用特殊值来识别内存块。您通常会从一个或少量大型连续区域中分配内存。分配元数据可以单独保存,但分配器将元数据放在同一空间中的情况并不少见,类似于您描述的内容。在这种情况下,您只需要第一个块的位置。该块附带的元数据,尤其是其记录的大小,告诉您如何找到下一个块(以及是否有),并告诉您如何找到下一个块,等等