使用空类

时间:2015-06-25 13:16:52

标签: c++

有人能说出在C ++中输出以下代码的确切原因吗?我收到的代码输出包含在标题注释中。它与虚拟表和v指针有什么关系。

/* sizeof(Empty) 1                                                                                
 sizeof(Derived1) 1 
 sizeof(Derived2) 8 
 sizeof(Derived3) 1 
 sizeof(Derived4) 16 
 sizeof(Dummy) 1
*/

#include <iostream>
using namespace std;

class Empty
{};

class Derived1 : public Empty
{};

class Derived2 : virtual public Empty
{};

class Derived3 : public Empty
{    
char c;
};

class Derived4 : virtual public Empty
{
char c;
};

class Dummy
{
 char c;
};

int main()
{

    cout << "sizeof(Empty) " << sizeof(Empty) << endl;
    cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;
    cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;
    cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;
    cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;    
    cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;
    return 0;

}

3 个答案:

答案 0 :(得分:4)

首先,即使没有成员的类也必须具有非零大小。标准坚持这一点。否则指针算术和数组将不起作用,因为零大小的类的数组将其所有元素放在同一个地方!

其他尺寸不同的事实很可能是由于v表。但是标准中没有明确强制要求,因此表明编译器处理事物的方式。

另请注意,多态性要求在基类中定义至少一个虚方法。这说明sizeof(Derived1)与基类的大小相同。

答案 1 :(得分:2)

大小的差异是因为编译器添加了<%= check_boxes_tag "eyecolor[]", options_for_select(@eyecolor, params['eyecolor']),{:multiple => true,:size=>5} %>

vptr,这是因为根据C ++标准,空类总是占用1个字节的内存。

sizeof(Derived1) = 1,因为它继承了虚拟基类Derived1,所以编译器(sizeof(Derived2) = 8位机器上的sizeof(vptr) = 8)添加了一个vptr,因此64是显示8个字节。

sizeof(Derived2)因为sizeof(Derived3) = 1的1个字节。

char,虚拟继承的内部实现完全依赖于编译器,因此您可以看到16个字节的大小。

sizeof(Derived4) = 16因为它包含一个char实体。

答案 2 :(得分:2)

Empty的大小为1,因为每个对象的大小必须至少为1。

出于同样的原因,

Derived1的大小为1。

Derived2的大小为8,因为您的编译器需要8个字节用于虚拟继承(可能是指针)。

Derived3的大小为1,因为您的编译器已应用&#34;空基类&#34;优化

Derived4的大小为16,因为虚拟继承所需的8个字节使对象需要8字节对齐。

Dummy的大小为1,因为它的大小为char