【问题标题】:Why c++ empty class have no byte alignment?为什么c++空类没有字节对齐?
【发布时间】:2020-09-03 08:17:32
【问题描述】:

我最近了解到空类的大小是 1 而不是零。为什么它没有字节对齐,其中 在 32 位环境下它的大小应该是 4?下一个对象的地址是什么?

【问题讨论】:

  • 为什么你认为它应该有对齐 4?
  • @bolov -- 因为在 32 位环境中,几乎所有东西都可以。
  • @PeteBecker 不,不是godbolt.org/z/CkQmMc
  • @PeteBecker 我不明白你的意思。在 x86-32 中,通常 4 字节或更大的对象具有 4 字节对齐,而较小的对象具有与其大小相等的对齐。所以这就是为什么我问为什么 OP 认为大小为 1 的对象应该对齐为 4。
  • @PeteBecker 我没有敌意。我的问题的重点是了解 OP 有哪些假设/误解,以便我们能够解决它们。

标签: c++ memory alignment sizeof empty-class


【解决方案1】:

因为 C++ 根本不保证变量的 4 字节对齐或字对齐。如果这对您很重要,您可以使用alignas 指定对齐要求:

struct alignas(4) my_empty_struct {};

现在,my_empty_struct 变量的地址将是 4 和 so will its size, apparently 的倍数。

或者,您可以自己使用虚拟字段填充您的结构以进行对齐。 alignas 有点像填充不可访问的字段。

【讨论】:

  • sizeof(my_empty_struct) 给了我 4。
  • @Waqar:会有所不同,但绝不是 0。
  • 谢谢@Waqar,我没想到会是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2016-10-12
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多