我现在正在测试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)
?
答案 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