gpt4 book ai didi

c - C 中用于内存管理器的各种长度结构?

转载 作者:行者123 更新时间:2023-12-04 11:21:55 25 4
gpt4 key购买 nike

我练习用 C 实现内存管理器。

我想要结构,它有不同的长度和 self 描述。所以,我偷看了一本 POSIX 教科书,像这样:

struct layout
{
uint32_t size; // array size in bytes, include space after the struct
uchar_t data[1];
};

// But, is next line correct?
layout *val = malloc (array_memory_in_bytes + sizeof (uint32_t) - 1);
// Where does a static array keep the pointer for using it?

如果我在不间断的内存中一个接一个地拥有多个这样的结构,并且我希望能够遍历它们。我可以写点东西吗,比如:

layout *val1 = pointer;
layout *val2 = val1 + val1.size + sizeof (val1.size);

或者你能推荐我一个更好的方法吗?

最佳答案

这个的标准 C 版本称为灵活数组成员,它看起来像:

struct layout
{
uint32_t size;
uchar_t data[];
};

// allocate one of these blocks (in a function)
struct layout *val = malloc( sizeof *val + number_of_bytes );
val->size = number_of_bytes;

代码val1->data + val1->size会给你一个指向你刚刚malloc的空间的最后一个指针'd.

但是,您不能迭代一个 malloc 的末尾'd block 并希望再打一个 malloc会挡住。要实现这个想法,您必须 malloc一大块然后放置各种struct layout整个对象,小心alignment .

在这种方法中,最好还存储每个 struct layout 位置的索引。是。理论上,您每次都可以从头开始浏览列表,然后添加 size然后进行对齐调整;但这会很慢,而且这意味着您无法处理中间的 block 被释放和重新“分配”。

如果这是为了直接替代 malloc那么实际上有两个对齐注意事项:

  • 对齐struct layout
  • data必须针对任何可能的类型对齐

解决这个问题的最简单方法是对齐 struct layout也适用于任何可能的类型。这可能看起来像(注意:#include <stdint.h> 必需):

struct layout
{
uint64_t size; // may as well use 64 bits since they're there
_Alignas(max_align_t) uchar_t data[];
};

另一种可能是保留 size在 32 位并输入 pragma pack防止填充;那么你需要使用一些额外的复杂性来确保 struct layoutmax_align_t 之前放置 4 个字节字节边界,等等。我建议先用简单的方法来做,然后让你的代码运行;然后稍后您可以返回并尝试此更改,以便根据需要节省几个字节的内存。


替代方法:

  • 保留 struct layout 的每个实例加上它在单独分配中的尾随数据。
  • 更改 data成为指向 malloc 的指针'd空间;那么你可以保留所有的struct layout数组中的对象。

关于c - C 中用于内存管理器的各种长度结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28997850/

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