我对类的结构化,填充以及由此产生的类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不变)。我知道我可以对其重新排序,以便double
首先出现,并且它缩小为32个字节;但是编译器可以做出此决定吗?还是程序员一贯的责任? (我假设编译器无法重新排序)
不允许编译器对成员重新排序,因为它们都具有相同的访问级别。因此,例如,如果有一个public
成员,则编译器可以对您的成员变量重新排序。
参考:https://timsong-cpp.github.io/cppwp/class.mem#19
C ++标准不保证您的类的大小,除了必须保证成员可以单独寻址之外。