【发布时间】:2019-12-13 15:40:41
【问题描述】:
我有一个关于类结构、填充以及由此产生的sizeof 类的快速问题。在下面的示例中,在我测试过的每个编译器上,sizeof A 的结果总是 40 字节,这对我来说很有意义。
#include <iostream>
class A {
int a, b; // 4 + 4
short c; // + 2
double f; // not currently 8 byte aligned. Currently 10 bytes, so pad 6 extra bytes, so: + 6 + 8
char w; // + 1
bool d; // + 1
double g; // not currently 8 byte aligned. Currently 26 bytes, so pad 6 extra bytes, so: + 6 + 8
// 4 + 4 + 2 + 6 + 8 + 1 + 1 + 6 + 8 = 40
};
int main() {
std::cout << sizeof( A );
}
我的问题是,这永远是真的吗? (假设每个成员的 alignof 和 size 不变)。我知道我可以对其重新排序,以便 doubles 排在第一位,然后缩小到 32 个字节;但是编译器可以做出这个决定吗?或者它总是程序员的责任? (我假设编译器无法重新排序)
【问题讨论】:
-
@KamilCuk,因此我还说如果每个成员的 sizeof 没有改变;)
-
在你的机器上总是如此。如果你在另一个或不同的编译器上编译它,它可能会有所不同。
-
如果你使用结构体,你可以强制禁用填充,因此结构体将始终保持相同的大小,而不管成员stackoverflow.com/a/8933773/3175478的顺序如何
-
@John:只有当你的编译器支持时。
-
基本类型可以有多种大小,请参阅:en.cppreference.com/w/cpp/language/types