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

wuc*_*ang 6 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
} 
Run Code Online (Sandbox Code Playgroud)

但是如果我删除了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
} 
Run Code Online (Sandbox Code Playgroud)

谁能解释sizeof(C)这两个例子中不同的输出?类S只是一个空类(我知道sizeof(S) == 1),那么为什么它是否A有基类有所不同?特别是因为它没有任何区别sizeof(A),只有sizeof(C)

Ant*_*vin 3

VS 似乎无法正确处理存在多个空基类的情况。在您的第一个示例中,有一个空基类,在第二个示例中,有两个。例如,在我的机器上,这段代码是在 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;
}
Run Code Online (Sandbox Code Playgroud)

输出

1 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

clang 和 gcc 都输出1 1 1 1 1 1.

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