【发布时间】:2013-07-10 00:47:22
【问题描述】:
给定示例类
class test
{
public:
test();
~test();
void someMethod();
void someOtherMethod();
private:
int var;
};
是sizeof(test) == sizeof(int),或者我们不能做出这样的假设?它依赖于平台/编译器吗?
编辑:
这样做的动机是通过流读/写类。类确实包含一个整数,并带有一些方便的访问方法 - 整数的最高位字节保留用于标志,3 个低位字节表示整数 24 位数。鉴于此,想法是编写此类变量的数组,并在需要时将它们作为纯 int 读取。引用为具有可能答案的问题并未解决该方面 - 更多的是关于填充多个元素。
【问题讨论】:
-
虽然我怀疑任何编译器都会在其中添加填充,但它可以。
-
请注意,您的类没有虚函数,也没有虚基类等。这简化了它。如果您的班级有任何虚拟,您可以相当确信其大小将大于
sizeof(int)(尽管标准不能保证这一点)。就目前而言,很可能是sizeof(test) == sizeof(int),但标准肯定不能保证这一点(编译器可以使其更大;它可能无法使其更小)。 -
我必须指出,除非您将数据移入或移出程序,否则您通常不应该关心类的大小与成员的大小不同。这是一个微观问题。除非您可以证明类的大小是代码中的特定瓶颈,否则采取措施确保其具有特定大小是过早的微优化。可能会产生负面影响的一种。
-
@John Dibling 是的,这样做的动机是通过 stream.write((char*)classVar,sizeof(test)); 之类的流读取/写入整个类;
-
@IlyaKobelevskiy:好的,这是正当的理由。这样做时要注意字节顺序。