gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:39 25 4
gpt4 key购买 nike

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

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)

最佳答案

当有多个空基类时,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;
}

输出

1 1 2 3 4 5

同时 both clang and gcc output 1 1 1 1 1 1 .

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

关于扩展前后的 C++ sizeof 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26257796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com