【问题标题】:alignas() effect on sizeof() - mandatory?alignas() 对 sizeof() 的影响 - 强制性的?
【发布时间】:2020-09-03 11:50:18
【问题描述】:

这个程序:

struct alignas(4) foo {};
int main() { return sizeof(foo); }

返回 4,使用 GCC 10.1 和 clang 10.1,以及 icc 19.0.1。

这让我想知道 - alignas() 是否必须以这种方式影响 sizeof()?即增加超出结构最初大小的大小?或者 - 这种变化只是实施的特权吗?

【问题讨论】:

  • 我记得和我的编程老师讨论过这个问题。 IIRC,由于要求数组在元素之间没有间隙,因此必须填充结构以使其大小成为对齐的倍数。
  • 如果foo f[10]; 不会以这种方式影响大小,它会做什么?
  • "...当应用于类类型时,结果是该类对象的大小加上将此类对象放入数组所需的任何额外填充...." 来源:en.cppreference.com/w/cpp/language/sizeof
  • @RichardCritten:那么,强制性的吗?
  • 这是我的理解,但没有手的标准参考。

标签: c++ c++11 language-lawyer sizeof alignas


【解决方案1】:

alignas() 是否必须以这种方式影响 sizeof() ?即增加超出结构最初大小的大小?

是的。类的大小是根据该类型数组的元素之间的距离来定义的。数组元素之间没有填充(除了类型内的填充,因此是大小的一部分)。如果 size 小于对齐,则相邻的数组元素不可能满足该对齐。

大小必须至少与对齐方式一样大,并且必须是对齐方式的倍数,并且对齐方式始终是 2 的幂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2017-04-13
    • 2013-08-30
    • 2021-03-09
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多