2010-03-02 69 views
55

可能重复:
C++: What is the size of an object of an empty class?为什么C++中空类的大小不为零?

为什么下面的输出1

#include <iostream> 

class Test 
{ 
}; 

int main() 
{ 
    std::cout << sizeof(Test); 
    return 0; 
} 
+4

有一个虚拟占位符成员,其大小恰好是一个字节。由于对于Test [10]的数组,每个对象都应该有一个唯一的地址。 – legends2k 2010-03-02 10:06:17

+4

一个有趣的优化是'空基优化',这意味着如果你从一个空基类继承(没有属性,没有虚方法),那么你的类的大小将不会增长。有许多(其他)条件,但它解释了为什么在某些情况下私下继承谓词。 – 2010-03-02 15:55:38

+0

[类似问题1](http://stackoverflow.com/questions/1626446)和[类似问题2](http://stackoverflow.com/questions/621616/)。 – Lazer 2010-05-16 06:11:36

回答

86

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

+2

嗯...但不应该连接器能够照顾,无论sizeof()返回什么?这不是更像是一种副作用吗?我明白你在说什么,但是对于sizeof(Test)返回0是不是完全可行的。但是,如果标准这么说,它就是这样说的。事实上,一旦明确而不是故意含糊地描述某个主题,这是一件好事。 – 2010-03-02 10:07:32

+12

@Amigable,那么会测试一个[10];'有大小?而'sizeof a/sizeof * a'会被0除。并且'for(Test * i = a; i!= a + 10; i ++)f(i);'也会失效。我相信这会造成很多问题,因为在编译器*和用户代码中需要很多特殊情况。 – 2010-03-02 12:21:49

+0

@Johannes,如此真实。我没有想到这一点。 – 2010-03-03 13:55:55

27

为了确保两个不同对象的地址会不同。 出于同样的原因,“新”始终 返回指向不同对象的指针。

请参阅Stroustrup以获得完整答案。

+1

转到直接页面链接 – 2013-03-03 04:12:00

20

C++标准保证任何类的大小至少为1。 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 talks about this了。

+2

什么指针算术涉及'sizeof(T)'_dividing_?我想不出一个例子。 Plase添加至少一个示例。 – MSalters 2010-03-02 13:55:52

+4

@ MSalters:遍历T类型元素的数组。 – wilhelmtell 2010-03-02 16:32:55

+1

@MSalters:减去两个指针返回元素之间的数量,而不是字节数。 – 2010-10-11 01:53:59

3

Maurits和Péter说了些什么。

有趣的是,在这一背景下的编译器可以做的空基类优化(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

9

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

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

  1. 国家
  2. 行为
  3. 身份

当我们在该对象的那个时候国家创建空类的对象是什么。该对象的行为也不算什么,但编译器会为该对象分配一个唯一的地址。 计算机中的内存始终以字节的形式组织,并且对象地址位置处的最小内存为1个字节。这就是为什么空类对象的大小是1字节的原因。

+0

如果任何人想要旋转对象的3个特征,即1)状态2)行为3)身份然后问我 – Shantanu 2011-10-17 08:13:32

相关问题