【问题标题】:How could I check if my memory allocation is correct?如何检查我的内存分配是否正确?
【发布时间】:2020-12-26 18:17:29
【问题描述】:

我正在尝试使用alloc crate 进行自己的内存分配。我实现它的方式,如果我理解 Layout 的工作原理,下面的行应该得到我想要分配的字节大小作为第一个参数,以及一个要四舍五入的值作为第二个参数。因此,在我的示例中,我想分配 20 个字节,因为我传递了该值,所以将四舍五入为 4096。然后 alloc 将分配该内存并返回一个指向我分配开始的指针。

let pr = alloc(Layout::from_size_align(20, 4096).unwrap());

我对功能的理解是否正确?另外,有没有办法检查指定的字节数是否已经分配?

【问题讨论】:

  • 我不太确定问题是什么,但 4096 的对齐非常非常大。四舍五入是什么意思?
  • 每次分配中的舍入将是 4096 的倍数,具体取决于输入大小。所以在本例中,20 将四舍五入为 4096 并分配 4096 B,如果大小为 5000,则将四舍五入为 4096 的第二倍数(8192)并分配 8192 B。我认为这就是它的工作原理,但我想要确认。此外,大小是如此之大,因为这是 UNIX 页面大小的默认值...

标签: rust


【解决方案1】:

对齐不是对分配的大小进行四舍五入。相反,它与指向分配开始的指针的整数值有关,因为该指针必须是对齐的倍数。

let pr = alloc(Layout::from_size_align(size, align).unwrap());
assert!(pr as usize % align == 0);

如果您想将分配的大小四舍五入到 4096 的下一个倍数,您可以这样做:

let rounded_size = (size + 4095) / 4096;

如果你要求 20 字节的大小,你的分配将只有 20 字节大,如果你想分配 4096 字节,你应该分配 4096 字节。


在为您的数据选择对齐方式时,您应该考虑将在分配中存储哪些类型。这是因为某些类型需要一定的最小对齐,例如u32 必须至少有 4 个对齐。

如果您在内存中存储的所有内容都是u8 字节,那么对齐为 1 就可以了。如果您需要存储 u16,则需要对齐 2。如果需要存储 u32,则需要 4,u64 需要 8。如果有多个,则应选择最大对齐其中一种类型需要,例如如果您将u8、u32 和u64s 存储在数据中,请选择对齐方式8。

您可以使用 align_of 计算类型的最小允许对齐方式。

【讨论】:

  • 我明白了,谢谢你的解释。但是,什么是 align 的一个好的默认值,因为我真的不需要在我的项目中使用它?或者我应该使用不同的 Layout 构造函数(我可以只传递字节数)?在文档中没有找到任何内容...
  • @icyfox 通常在为某物分配内存时,您会大致知道该 something 是什么。如果您打算存储一个结构,请使用std::mem::size_of 和std::mem::align_of 来作为您的布局的基础。拥有“默认值”没有多大意义:太低,您可能无法提供所需的对齐方式,而太高,您会在对齐填充上浪费内存。话虽如此,我相信标准malloc 的最小对齐方式为8。
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 2021-04-04
  • 2010-12-07
  • 2011-10-04
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多