为什么C ++中的空类的大小不为零?
可能重复:
C ++:空类的对象的大小是多less?
为什么下面的输出1
?
#include <iostream> class Test { }; int main() { std::cout << sizeof(Test); return 0; }
该标准不允许大小为0的对象(及其类),因为这将使得两个不同的对象具有相同的存储器地址成为可能。 这就是为什么即使空的类也必须具有(至less)1的大小。
确保两个不同对象的地址不同。 出于同样的原因,“新”总是返回指向不同对象的指针。
请参阅Stroustrup以获取完整的答案。
C ++标准保证任何类的大小至less是一个。 C ++标准规定,任何对象都不应该具有与另一个对象相同的内存地址。 这有几个很好的理由。
-
为了保证
new
将始终返回一个指向不同内存地址的指针。 -
为了避免零分。 例如,指针算术(其中许多是由编译器自动完成的)涉及除以
sizeof(T)
。
但是请注意,这并不意味着一个空的基类将派生类的大小加1:
struct Empty { }; struct Optimized : public Empty { char c; }; // sizeof(Optimized) == 1 with g++ 4.0.1
Bjarne Stroustrup也谈到这一点。
没有任何数据成员和成员函数的类这样的类被称为空类。 空类对象的大小总是1个字节。
当我们创build任何类的对象的时候,对象总是得到3个特征,即
- 州
- 行为
- 身分
当时我们创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 。