我有一个关于类结构、填充和由此产生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 );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这会永远是真的吗?(假设每个成员的 alignof 和 sizeof 没有改变)。我知道我可以对它重新排序,以便doubles排在第一位,然后缩小到 32 个字节;但是编译器可以做出这个决定吗?或者它总是程序员的责任?(我假设编译器不能重新排序)
不允许编译器对成员重新排序,因为它们都具有相同的访问级别。因此,例如,如果有一个public成员,那么编译器可以对您的成员变量重新排序。
参考:https : //timsong-cpp.github.io/cppwp/class.mem#19
C++ 标准不保证您的类的大小,除了必须保证成员可以单独寻址。
sizeof(A)在执行你的程序时总是一样的。如果您更改成员的顺序或如何A打包和重新编译,那么您可以/将获得不同的值。如果您使用不同的编译器进行编译,则大小也可能会发生变化。它也可以在使用相同编译器的不同机器上更改,因为不同机器的基本类型可能具有不同的大小。
长话短说,如果你依赖你的班级是一个特定的大小,那么添加一个static_assert检查它的。这样,如果它确实改变了,你会得到一个很好的编译器错误,而不是可能的 UB。
我知道我可以重新排序它,以便双打在前,然后缩小到 32 个字节;但是编译器可以做出这个决定吗?
不,编译器无法对成员重新排序以更好地打包,因为您的类是标准布局类,并且所有成员必须按声明的顺序在内存中布置。
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |