为什么C ++中的空类的大小不为零?

可能重复:
C ++:空类的对象的大小是多less?

为什么下面的输出1

 #include <iostream> class Test { }; int main() { std::cout << sizeof(Test); return 0; } 

该标准不允许大小为0的对象(及其类),因为这将使得两个不同的对象具有相同的存储器地址成为可能。 这就是为什么即使空的类也必须具有(至less)1的大小。

确保两个不同对象的地址不同。 出于同样的原因,“新”总是返回指向不同对象的指针。

请参阅Stroustrup以获取完整的答案。

C ++标准保证任何类的大小至less是一个。 C ++标准规定,任何对象都不应该具有与另一个对象相同的内存地址。 这有几个很好的理由。

  1. 为了保证new将始终返回一个指向不同内存地址的指针。

  2. 为了避免零分。 例如,指针算术(其中许多是由编译器自动完成的)涉及除以sizeof(T)

但是请注意,这并不意味着一个空的基类将派生类的大小加1:

 struct Empty { }; struct Optimized : public Empty { char c; }; // sizeof(Optimized) == 1 with g++ 4.0.1 

Bjarne Stroustrup也谈到这一点。

没有任何数据成员和成员函数的类这样的类被称为空类。 空类对象的大小总是1个字节。

当我们创build任何类的对象的时候,对象总是得到3个特征,即

  1. 行为
  2. 身分

当时我们创build空类对象的时候,那个对象的状态是什么都没有。 该对象的行为也是没有,但编译器分配一个唯一的地址,该对象。 计算机中的内存总是以字节的forms组织,并且在对象地址位置处可用的最小内存为1个字节。 这就是为什么空类对象的大小是1字节的原因。

莫里茨和佩特说了些什么。

有趣的是,在这种情况下,编译器可以做空基类优化(EBCO):

 #include <iostream> struct Foo {}; struct Bar : Foo {}; int main () { std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl; } 

如果编译并运行它,可能会打印“1,1”。 请参阅EBCO上的Vandevoorde / Josuttis 16.2 。