gpt4 book ai didi

c - malloc 如何使用严格的别名 - 它只能在单个编译单元内被违反吗?

转载 作者:行者123 更新时间:2023-12-04 01:30:13 25 4
gpt4 key购买 nike

看完this ,我有类似的问题 this one ,想知道内存分配器如何在不违反严格的别名规则的情况下工作。但我不是想知道重新使用释放的内存,我想知道如何在不违反严格别名的情况下将分配的对象定位在线性内存中。

到目前为止,我看过的所有堆内存分配器都将它们的内存划分为某种 block ,前面有一个 header 。但是,malloc 返回一个 void * 并且通常指向紧跟在 header 之后的内存。这是一个非常缩小的例子来说明这一点。

#include <stddef.h>

struct block_header {
size_t size;
};

struct block_header *request_space(size_t size);

void *malloc(size_t size) {
struct block_header *block = request_space(size);

// I guess this violates strict aliasing, because the caller will
// convert the pointer to something other than struct block_header?
// Or why wouldn't it?
return block + 1;
}

我已经研究了一段时间了,但我看不出分配器如何在不违反严格别名的情况下将其指针定位在内存区域中。我错过了什么?

最佳答案

根据标准,这些东西永远不会违反严格的别名:

  • 转换指针。
  • 做指针运算。
  • 写入 malloc 空间。

在 malloc 空间中不允许做的事情是读取一些内存作为不同于写入的类型(当然允许的别名类型列表除外)。

规则的文本在 C11 6.5/7 中:

An object shall have its stored value accessed only by [...]

并且 6.5/6 中的文本解释说,如果我们在 malloc 空间中,那么写入会将写入的类型印在目标上(因此不会存在类型不匹配)。

到目前为止,您发布的代码从未执行禁止的操作,因此没有明显的问题。如果有人使用您的分配器然后读取内存而不写入它,只会出现问题。

脚注 1:根据 committee response to DR236,6.5/6 显然是有缺陷的但从未修复,所以谁知道我们会离开哪里。

脚注 2: 正如 Eric 指出的那样,该标准不适用于实现内部,但请考虑我在某些用户编写的分配器的上下文中的评论,就像您链接到的其他问题一样。

关于c - malloc 如何使用严格的别名 - 它只能在单个编译单元内被违反吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61177436/

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