C ++ RTTI继承导致类大小增加

时间:2009-05-11 21:59:05

标签: c++ class object rtti

在C ++中,问题很简单。

我有2个类,其中一个包含另一个作为其实现的一部分。

struct A
{
    void do_something()
    {
    };
};

struct B
{
    A obj_A;
    void hello_world()
    {
    };
};

现在的问题是,当我执行sizeof(B)和类型B的对象时,如果A是B的一部分,则结构B大一个字节.A是100%仅包括非虚拟成员(没有虚拟)需要表)并且不需要进行typeid检查。是否有任何方法(如编译器指令)从B中完全删除不需要的字节但仍然通过B访问A的成员函数?

我只能假设额外的字节是编译器为A的名字“A”添加了char *,但任何其他想法都会有所帮助。

2 个答案:

答案 0 :(得分:4)

sizeof(A)不能为0,因为对象的每个部分都应该是“可寻址的”(当我们使用operator&时应该有不同的地址)

struct A
{
};

struct B
{
    A m_a1;
    A m_a2;
};

void test()
{
    B b;
    A* pa1 = &b.m_a1;
    A* pa2 = &b.m_a2;

    // "pa1" need to be different from "pa2" 
}

答案 1 :(得分:2)

不幸的是,你没有提到编译器。

无论如何,在您发布的代码中,A类是“空基类优化”的候选者。这是C ++标准的一部分,它说没有成员变量的基类可以被优化掉而不占用任何字节。

B必须通过C ++标准占用空间,因为它至少包含一个成员(即obj_A)。

您可以通过调用do_something()直接从B中访问A的成员函数。不需要魔法。