一个 c++小题目

2018-10-24 15:26:16 +08:00
 v2byy
class X {};

class Y : public virtual X{};
class Z: public virtual X{};

class A:public Y, public Z{};

void test_sizeof_class() {
	size_t temp = sizeof(X);
	temp = sizeof(Y);
	temp = sizeof(Z);
	temp = sizeof(A);
}

请问 sizeof 分别的结果是多少?说出理由哦

2672 次点击
所在节点    C
10 条回复
wutiantong
2018-10-24 15:34:27 +08:00
X 是 1,Y&Z 是 8,A 是 Y+Z。
如果去掉 virtual,Y&Z 是 1,A 还是 Y+Z。
运行结果告诉我的。。。
coordinate
2018-10-24 16:05:07 +08:00
编译器行为,空类为 1,虚继承中添加了虚指针。
innoink
2018-10-24 16:10:50 +08:00
虚基类指针
SeaRecluse
2018-10-24 16:11:49 +08:00
能不能先把空格对齐了,看着好难受:(
yanjusong
2018-10-24 16:17:58 +08:00
msvc120 下结果:
sizeof(X)=1
sizeof(Y)=4
sizeof(Z)=4
sizeof(A)=8

class X size(1):
+---
+---

class Y size(4):
+---
0 | {vbptr}
+---
+--- (virtual base X)
+---

class Z size(4):
+---
0 | {vbptr}
+---
+--- (virtual base X)
+---

class A size(8):
+---
| +--- (base class Y)
0 | | {vbptr}
| +---
| +--- (base class Z)
4 | | {vbptr}
| +---
+---
+--- (virtual base X)
+---
v2byy
2018-10-24 17:38:23 +08:00
@yanjusong 请问这个树状图怎么搞出来的?
sfqtsh
2018-10-24 17:59:53 +08:00
@v2byy 搜下 cl.exe /d1reportSingleClassLayout
liberize
2018-10-24 18:13:06 +08:00
jiang42
2018-10-24 18:24:39 +08:00
觉得是 UB 吧……有没有精通标准的大佬出来指点一下
yanjusong
2018-10-24 19:01:49 +08:00
@v2byy vs 开发人员工具下
cl normal-inheritance.cpp /d1reportSingleClassLayoutX

d1reportSingleClassLayoutX 后面的 X 是类名

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/500682

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX