【问题标题】:What is meant by "Given alignment and size, align the pointer"“给定对齐方式和大小,对齐指针”是什么意思
【发布时间】:2021-10-24 03:26:53
【问题描述】:

我知道对齐指针意味着什么。我相信这里的“大小”是指指针指向的对象所占用的内存大小。但是你也得到了一个“对齐”变量。这个变量的含义是什么?在这种情况下,它只是您希望地址成为倍数的值吗?例如,4(我认为这是典型的)?

【问题讨论】:

标签: c++ pointers alignment


【解决方案1】:

在这种情况下,它只是您希望地址成为倍数的值吗?例如,4

是的。

为了对齐指针,将未对齐的地址四舍五入到最接近的倍数。 C++ 标准库中有一个用于此目的的标准函数:std::align。该函数还可用于测试指针是否对齐。

【讨论】:

  • @user5965026 假设您的内存范围为地址 6...32。这是作为指向第一个地址 6 和总大小的指针提供给您的。您需要在那里创建一个大小为 16 且对齐为 4 的类型的对象。您可以在该内存的哪个位置创建这样的对象?
  • @user5965026 答案:您不能在地址 6 中创建对象,因为该地址未与 4 字节边界对齐。您也不能在地址 4 中创建对象,因为它超出了您给定的内存范围。您可以在地址 8 中创建对象,因为它是对齐的并且对象适合内存区域。 6 舍入到最接近 4 的倍数是 8。
  • 明白。我实际上删除了我的问题,因为我之前混淆了一些概念:)。所以要将给定的指针四舍五入,比如ptr,看起来你只是做类似(ptr + alignment - 1) / alignment * alignment)的事情?
  • @user5965026 这不适用于指针,因为您不能对指针进行除法或乘法运算。如果它是对象类型的指针,则加法以大小为增量进行。
  • 哦,我明白了。如果ptrint *,我似乎可以使用((intptr_t)ptr + alignment - 1) / alignment * alignment) 让它工作。如果不使用std::align,您将如何处理自定义数据类型?
猜你喜欢
  • 2016-06-11
  • 2022-01-23
  • 2014-09-24
  • 2011-05-09
  • 2023-03-25
  • 2011-05-18
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多