【发布时间】:2019-07-03 00:41:30
【问题描述】:
假设我有一些结构 S 和一个非静态成员 member,如下例所示:
struct S { alignas(alignof(void *)) char member[sizeof(void *)]; };
你如何得到member的对齐方式?
运算符 alignof 只能应用于完整类型,而不是表达式 [in 7.6.2.5.1],虽然 GCC 允许,所以 alignof(S::member) 和 Clang 支持它。
没有此限制的“语言律师”标准方法是什么?
另外,sizeof 允许表达式参数,是否存在不对称的原因?
实际关心的是能够获取模板结构成员的对齐方式,您可以通过decltype 获取它们的类型,sizeof 获取它们的大小,但是您还需要对齐方式。
【问题讨论】:
-
您在寻找什么?您是否希望
alignof(S::member)成为alignof(void *)或alignof(S)或其他?我不清楚“非静态成员的对齐”是什么意思。 -
也许
offsetof(S, member);是你想要的?如果你愿意,可以检查它是否是4或alignof(void *)的倍数。 -
我不认为你可以......只需引入一个 constexpr 值,它就是你想要的对齐方式,并在你需要的任何地方使用它而不是 alignof(包括在 alignas 中)(也是
alignofinalignas(alignof(void*))是多余的) -
感谢 cmets,但请注意问题是指语言标准而非实际解决方法
-
@TheCppZoo 谢谢。我了解“非静态成员”的含义。我的观点是“数据成员的对齐”尚不清楚。类型或变量的“对齐”是指该变量可以放置在哪些内存地址:地址必须是对齐的倍数。有了这个想法,数据成员的对齐将描述成员可能位于的地址,即
alignof(S),但不是一个干净的倍数,而不是K * alignof(S) + offsetof(S, member)用于某些K。或者,如果它本身是一个变量,您可能只是要求成员对齐。
标签: c++ language-lawyer typetraits