v2byy
V2EX  ›  C

一个 c++小题目

By v2byy at 2018 年 10 月 24 日 · 3661 次点击
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 分别的结果是多少?说出理由哦

第 1 条附言  ·  2018 年 10 月 29 日
append 一下,查看 object layout 的方式:

- g++:
编译时参数: -fdump-class-hierarchy




- visual c++:
编译时参数:/d1reportAllClaaLayout
10 条回复  •  2018-10-24 19:01:49 +08:00
wutiantong
   1
wutiantong  
   2018 年 10 月 24 日
X 是 1,Y&Z 是 8,A 是 Y+Z。
如果去掉 virtual,Y&Z 是 1,A 还是 Y+Z。
运行结果告诉我的。。。
coordinate
   2
coordinate  
   2018 年 10 月 24 日
编译器行为,空类为 1,虚继承中添加了虚指针。
innoink
   3
innoink  
   2018 年 10 月 24 日 via Android
虚基类指针
SeaRecluse
   4
SeaRecluse  
   2018 年 10 月 24 日
能不能先把空格对齐了,看着好难受:(
yanjusong
   5
yanjusong  
   2018 年 10 月 24 日
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
   6
v2byy  
OP
   2018 年 10 月 24 日 via iPhone
@yanjusong 请问这个树状图怎么搞出来的?
sfqtsh
   7
sfqtsh  
   2018 年 10 月 24 日 via Android   ❤️ 1
@v2byy 搜下 cl.exe /d1reportSingleClassLayout
jiang42
   9
jiang42  
   2018 年 10 月 24 日 via iPhone
觉得是 UB 吧……有没有精通标准的大佬出来指点一下
yanjusong
   10
yanjusong  
   2018 年 10 月 24 日   ❤️ 1
@v2byy vs 开发人员工具下
cl normal-inheritance.cpp /d1reportSingleClassLayoutX

d1reportSingleClassLayoutX 后面的 X 是类名
© 2026 V2EX · 67ms · 3.9.8.5