具有单个 char 数组成员的结构是否保证具有可预测的大小?

MC *_* ΔT 2 c++ language-lawyer c++20

考虑以下结构:

struct alignas(8) Foo {
    char data[8];
};
Run Code Online (Sandbox Code Playgroud)

标准是否保证这一点sizeof(Foo) == 8

从外行人的角度来看,这应该是正确的,因为 8char不需要任何填充即可对齐为 8。并且在 GCC、Clang 和 MSVC 上的实践中似乎也是如此(现场演示)。

然而,填充和对齐是一件棘手的事情,我找不到任何严格禁止实现添加无关填充的信息 - 即也sizeof(Foo) == 16可能吗?

到目前为止我发现了以下内容:

  • sizeof(char[8]) == 8是有保证的(见这里),因此sizeof(Foo) >= 8)
  • Foo没有前导填充,因为它是标准布局类型(请参见此处
  • 至少有一个更有知识的人 - 作者std::bit_cast- 显然认为没有填充 -请参阅这篇文章

(有趣的是,如果这个事实不正确,则似乎意味着结构可以具有任意大的大小,这有点奇怪。)

Nic*_*las 6

实现可以根据需要自由添加尽可能多的填充。类型的大小至少限于其内容的大小,但这就是标准的全部要求。

我无法真正指出不存在的东西,因此我无法链接到标准中不施加限制的部分。

一般来说,实现不会对类型的大小做出奇怪的事情。ABI 要求可能会限制实现。但就标准本身而言,并没有这样的要求。