gpt4 book ai didi

c - 在单个字中存储整数和位

转载 作者:行者123 更新时间:2023-12-02 05:25:14 24 4
gpt4 key购买 nike

我正在阅读 presentation on the implementation of malloc , 在幻灯片 7 上,它建议将区域大小和可用性存储在一个单词中以节省空间。另一种方法是使用两个字,这很浪费,因为可用性位只需为 0 或 1。

这是给出的解释:

  • 如果 block 是对齐的,低位地址位总是0
  • 为什么要存储一个始终为 0 的位?
  • 将其用作分配/空闲标志!读取size字时,必须屏蔽掉这一位

http://courses.engr.illinois.edu/cs241/sp2012/lectures/09-malloc.pdf

但我不太了解它是如何工作的以及如何在 C 中实现它。为什么大小整数的一位总是 0?

最佳答案

  • If blocks are aligned, low-order address bits are always 0

这是理解它发生了什么的关键。许多 CPU 要求将多字节原始值存储在可被原始字节数整除的地址:16 位原始值需要存储在偶数地址; 32 位 int 需要存储在可被 4 整除的地址,依此类推。尝试通过对应于奇数地址的指针访问 int 会导致总线错误。

在像这样的系统中,malloc 必须始终返回适合存储给定 CPU 支持的任何原语的地址。因此,如果 CPU 支持 32 位整数,则 malloc 返回的所有地址都必须能被 4 整除。这样的地址被称为对齐。为了符合要求,malloc 实现在末尾将程序请求的大小块填充 0 到 3 个字节,使其长度可被 4 整除。作为此决定的结果,对齐 block 地址的最后两位将始终为零。 malloc 的实现可以将这些位用于其自己的目的,只要在将结果返回给调用者之前将它们“屏蔽掉”即可。

关于c - 在单个字中存储整数和位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13176341/

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