gpt4 book ai didi

c - 填充字节是否在内存分配器中被视为已分配或未分配?

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:44 25 4
gpt4 key购买 nike

我正在我的程序中编写一个自定义内存分配器,并试图更好地理解什么是已分配内存和未分配内存。有人告诉我,对于一个基本的、“天真的”sbrk() 内存分配器,对 sbrk() 的调用必须提供与 16 字节(的倍数)对齐的大小。这意味着如果我需要分配例如 5 个字节的内存,则应用 (5 + (16-1)) & ~(16-1)) 操作,在本例中四舍五入为 16。如果请求的大小是 17 而不是 5,那么它将四舍五入为 32。

这意味着我们从操作系统返回的字节数比用户为对齐请求的字节数多。我的问题是,11 个字节(在第一个示例的情况下)或 15 个字节(在第二个示例的情况下)是否被视为“已分配”?在内存分配器的正确实现中,用户实际上可以在请求的大小和 16 字节边界之间使用多于请求的字节吗?如果不是,这是如何执行的?

最佳答案

My question is, are the 11 bytes (in the case of the first example) or 15 bytes (in the case of the second example) considered "allocated" or not?

不,它们不被视为已分配。更具体地说,这些字节不属于用户程序,它们属于内存分配器。

In a proper implementation of a memory allocator, could the user actually use more than the requested bytes between the requested size and the 16 byte boundary?

不,用户的程序只允许使用请求的内存。

If not, how is this enforced?

它不是强制执行的。这是 C 语言区别于其他语言的地方。 C有很多规则,但它不强制执行。程序员必须了解规则,并遵守规则。如果程序员不遵守规则,结果就是undefined behavior。 .另见 this post .用 C 规范的话来说(强调已添加):

Possible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).

关于c - 填充字节是否在内存分配器中被视为已分配或未分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57541722/

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