【问题标题】:Compute size of object if it has to be aligned as a specific type如果必须将对象对齐为特定类型,则计算对象的大小
【发布时间】:2014-07-18 15:12:57
【问题描述】:

C++ 标准库中是否存在“如果对齐为 T 类型的 sizeof”。我说的是这样的:

template<class U,class T>
constexpr size_t size_of(const T& x)
{
  return (sizeof(x) + sizeof(U) - 1)/sizeof(U);
}

如果我知道名称,我会很容易找到它,但搜索功能比搜索名称要困难得多。

【问题讨论】:

  • 你搜索的不是alignof吗? en.cppreference.com/w/cpp/language/alignof
  • @ForEveR 不,alignof 给出了对齐方式,而不是大小: size_of('X')==8 字节在 64 位机器上,但 alignof('X')==1 字节

标签: c++ sizeof memory-alignment


【解决方案1】:

我不知道有任何函数提供“X 的大小,对齐调整为 U 的大小”。

您的计算似乎是错误的,我会使用:

return (sizeof(x) + sizeof(U) - 1) & ~(sizeof(U)-1);

这假设 U 的大小始终是 2 的幂。如果它不总是 2 的幂,那么你需要:

return (sizeof(x) + sizeof(U) - 1) - sizeof(x) % sizeof(U);

return ((sizeof(x) + sizeof(U) - 1)/sizeof(U)) * sizeof(U);

(您的函数以U 为单位计算x 的大小)

但是,如果您想“修复”结构或类的对齐方式,您可以使用属性 - 不幸的是,编译器对于如何解决这个问题有不同的想法:

在 gcc 和 clang 中:

struct T { ... } __attribute__((aligned(sizeof(U))));

在 msvc 中并兼容:

__declspec( align( sizeof(U) ) )  struct T { ... }

(我不能 100% 确定 sizeof(U) 确实有效 - 您可能需要将其编码为 2、4、8、16 或其他任何值,我相信这两者都需要对齐始终是2) 的幂

【讨论】:

  • “您的函数将 x 的大小计算为 U 的单位”:是的。这也是可用的,因为我将使用该函数来放置 POD:s,因此如果重新调整该值,我将需要除以得到 U 的单位。
猜你喜欢
  • 2011-12-03
  • 2017-06-12
  • 2019-02-13
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2021-07-21
相关资源
最近更新 更多