c – sizeof类是否保证仅包含元素的大小
参见英文答案 >
Why isn’t sizeof for a struct equal to the sum of sizeof of each member?????????????????????????????????????11个
给出示例类 class test { public: test(); ~test(); void someMethod(); void someOtherMethod(); private: int var; }; 是sizeof(test)== sizeof(int),还是我们不能做出这样的假设?它依赖于平台/编译器吗? 编辑: 对此的动机是通过流读/写类.类确实包含一个整数,有一些方便的访问方法 – 整数的最高位字节保留用于标志,3个低位字节表示整数24位数.鉴于此,想法是编写这样的类变量的数组,并在需要时将它们读作plain int.引用可能答案的问题没有解决这个问题 – 更多的是关于使用多个元素的填充. 解决方法
一般来说,没有你不能假设某个任意类的大小只是它的成员大小的聚合.一般来说,你也不应该关心*.编译器可以并且将改变类的大小,使它们的大小是某个特定字节数的倍数.这样做的原因是为了提高性能.每个平台的字节数是多少.
在这个具体的例子中,实际上可能是sizeof(test)== sizeof(int)的情况,但我怀疑这是提示这个问题的真实代码. 有一些方法可以确保它确实如此,但它们依赖于特定于平台的功能. 首先,确保你的课程是POD *,所有成员都是自己的POD. 其次,将打包设置为1个字节.在GCC和MSVC下,执行此操作的说明类似于: #pragma pack (1) 如果不是严格需要,您应该关闭此包装,因为它可能会对性能产生负面影响: #pragma pack (push,1) class test { public: void someMethod(); void someOtherMethod(); int var; }; #pragma pack (pop) 请注意,上面我删除了私有部分.如果它具有非静态私有或受保护的数据成员,则该类不是POD.出于同样的原因,我也删除了默认的构造函数和析构函数. 在MSVC和GCC下,sizeof(test)将等于sizeof(int). POD:普通的旧数据类型.为了使类(或结构)成为POD,它必须没有用户定义的析构函数或构造函数,复制赋值运算符,并且没有指向成员的类型指针的非静态成员.此外,它必须没有虚拟,没有私有或受保护的非静态成员,也没有基类.此外,它所拥有的任何非静态数据成员也必须是POD本身.换句话说,只是普通的旧(公共)数据. “你也不应该关心.”通常,您需要确保某些类的大小与成员的大小完全相同才是系统的边界.例如,通过套接字将数据移入或移出程序时.编译器填充您的类是有原因的.除非您有特定的,可证明的原因,否则不应覆盖此编译器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |