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- 显然认为没有填充 -请参阅这篇文章(有趣的是,如果这个事实不正确,则似乎意味着结构可以具有任意大的大小,这有点奇怪。)
实现可以根据需要自由添加尽可能多的填充。类型的大小至少限于其内容的大小,但这就是标准的全部要求。
我无法真正指出不存在的东西,因此我无法链接到标准中不施加限制的部分。
一般来说,实现不会对类型的大小做出奇怪的事情。ABI 要求可能会限制实现。但就标准本身而言,并没有这样的要求。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |