首页 > 解决方案 > sizeof 总是一样吗?

问题描述

我有一个关于类结构、填充和生成sizeof的类的快速问题。在下面的示例中,在我测试过的每个编译器上,结果总是 40 字节sizeof A,这对我来说很有意义。

#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 个字节;但是编译器可以做出这个决定吗?或者它总是程序员的责任?(我假设编译器无法重新排序)

标签: c++sizeof

解决方案


不允许编译器对成员重新排序,因为它们都具有相同的访问级别。因此,例如,如果有一个public成员,那么编译器可以重新排序您的成员变量。

参考:https ://timsong-cpp.github.io/cppwp/class.mem#19

C++ 标准不保证类的大小,除非它必须保证成员可以单独寻址。


推荐阅读