gpt4 book ai didi

c++ - sizeof 总是一样吗?

转载 作者:行者123 更新时间:2023-12-02 03:05:27 24 4
gpt4 key购买 nike

我有一个关于类结构、填充以及生成的类的size 的简单问题。在下面的示例中,在我测试过的每个编译器上,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 个字节;但是编译器可以做出这个决定吗?或者这始终是程序员的责任? (我假设编译器无法重新排序)

最佳答案

程序执行中的

sizeof(A) 将始终相同。如果您更改成员的顺序或 A 的打包和重新编译方式,那么您可以/将会获得不同的值。如果使用不同的编译器进行编译,大小也会发生变化。它也可以在使用相同编译器的不同机器上进行更改,因为不同的机器可以具有不同的基本类型大小。

长话短说,如果您依赖于您的类具有特定大小,则添加一个 static_assert 来检查该大小。这样,如果它确实发生变化,您将得到一个很好的编译器错误,而不是可能的 UB。

I know I can reorder it, so that the doubles come first, and it shrinks down to 32 bytes; but can a compiler make this decision?

不,编译器无法重新排序成员以更好地打包,因为您的类是标准布局类,并且所有成员必须按声明的顺序在内存中布局。

关于c++ - sizeof 总是一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59325695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com