我现在正在测试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)?
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)
但这种行为仍然符合标准,因为标准并不强制实现优化空基类。
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |