c++ - 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 不变)。我知道我可以重新排序,让double
s 先出现,然后缩小到 32 个字节;但是编译器可以做出这个决定吗?或者它总是程序员的责任?(我假设编译器无法重新排序)
解决方案
不允许编译器对成员重新排序,因为它们都具有相同的访问级别。因此,例如,如果有一个public
成员,那么编译器可以重新排序您的成员变量。
参考:https ://timsong-cpp.github.io/cppwp/class.mem#19
C++ 标准不保证类的大小,除非它必须保证成员可以单独寻址。
推荐阅读
- javascript - 在多行文本中使用正则表达式阻止逗号
- css - React Native 按钮点击区域/区域
- mongodb - 在聚合框架中多次分组,保持多个字段
- android - 在 kotlin 中使用另一个集合转换项目集合
- tfs - Azure Pipeline 中的 SSL_ERROR_SYSCALL 以访问我们的内部 TFS 2018 服务器
- typescript - Typescript 函数,它采用具有 Date 属性的对象并集,并返回将 Dates 转换为字符串的相同对象
- uml - Astah UML 是否可以生成嵌套类图?
- spring - 使用 spring cassandra 时面临的问题 - UDT 类型,无法将 udt 类型映射到 udtvalue
- java - java.lang.ExceptionInInitializerError 通过TestNG selenium 自动化打开另一个页面
- django - Django:避免从管理面板重复上传图片