扩展前后的C ++ sizeof运算符

时间:2014-10-08 13:12:17

标签: c++ sizeof

我现在正在测试C ++ sizeof运算符的结果:

class S{};
class A:public S{
    virtual void fun()=0;
};
class B{};
class C : public B,public A {};

int main(){
     cout<<sizeof(A)<<endl;// result is 4
     cout<<sizeof(C)<<endl;// result is 8
} 

但是如果我删除了S类的扩展名:

class A{
    virtual void fun()=0;
};
class B{};
class C : public B,public A{};

int main(){
    cout<<sizeof(A)<<endl;// result is 4
    cout<<sizeof(C)<<endl;// result is 4
} 

在这两个例子中,有人可以解释sizeof(C)的不同输出吗?类S只是一个空类(我知道,sizeof(S) == 1),那么为什么A是否有基类会有所不同?特别是因为它对sizeof(A)没有任何影响,只有sizeof(C)

2 个答案:

答案 0 :(得分:3)

当有多个空基类时,似乎VS无法正确处理这种情况。在你的第一个例子中,theres是一个空的基类,而在第二个例子中有两个。例如,在我的方框中,此代码在VS2013上编译:

#include <iostream>

class B1 {};
class B2 {};
class B3 {};
class B4 {};
class B5 {};
class B6 {};

class C1 : B1 {};
class C2 : B1, B2 {};
class C3 : B1, B2, B3 {};
class C4 : B1, B2, B3, B4 {};
class C5 : B1, B2, B3, B4, B5 {};
class C6 : B1, B2, B3, B4, B5, B6 {};

int main() {
    std::cout << sizeof(C1) << ' ' << sizeof(C2) << ' ' << sizeof(C3) << ' '
        << sizeof(C4) << ' ' << sizeof(C5) << ' ' << sizeof(C6) << std::endl;
}

输出

1 1 2 3 4 5

both clang and gcc output 1 1 1 1 1 1

但是这种行为仍然符合标准,因为标准并没有强制实现优化空基类。

答案 1 :(得分:1)

似乎在多重继承中,Visual Studio为每个空类保留至少1个字节。

默认对齐为4个字节,这导致C类为8个字节。

但这可能有用。

使用多重继承,C类看起来像这样:

B部分

S部分

部分

C部分

预订允许获得部件的不同身份,如下所示:

C c1;
printf("address of S part %ld\n",static_cast<S*> (&c1));  // prints 4651208
printf("address of B part %ld\n",static_cast<B*> (&c1));  // prints 4651209 with one byte alignment