gpt4 book ai didi

c++ - 使用哪个工具查看多重继承的内存布局

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:21 24 4
gpt4 key购买 nike

有没有一种工具可以用来查看编译后的 C++ 代码的多重继承内存布局?

最佳答案

我不知道你到底想知道什么。对于这个简单的例子

class classA { };

class classB { };

class classC : public classA, public classB {

};

$ g++ -fdump-class-hierarchy test.cpp

将以下内容输出到文件 test.cpp.002t.class

Class classA
size=1 align=1
base size=0 base align=1
classA (0xb7b06780) 0 empty

Class classB
size=1 align=1
base size=0 base align=1
classB (0xb7b067bc) 0 empty

Class classC
size=1 align=1
base size=1 base align=1
classC (0xb7a736e0) 0 empty
classA (0xb7b067f8) 0 empty
classB (0xb7b06834) 0 empty

有关详细信息,请参阅 gcc 联机帮助页。将 classA 更改为此:

class classA { int aObj; virtual void aFun() { } };

突然弹出一个虚拟表:

Vtable for classA
classA::_ZTV6classA: 3u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI6classA)
8 classA::aFun

Class classA
size=8 align=4
base size=8 base align=4
classA (0xb7b4d7f8) 0
vptr=((& classA::_ZTV6classA) + 8u)

Class classB
size=1 align=1
base size=0 base align=1
classB (0xb7b4d9d8) 0 empty

Vtable for classC
classC::_ZTV6classC: 3u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI6classC)
8 classA::aFun

Class classC
size=8 align=4
base size=8 base align=4
classC (0xb7aba820) 0
vptr=((& classC::_ZTV6classC) + 8u)
classA (0xb7b4da14) 0
primary-for classC (0xb7aba820)
classB (0xb7b4da50) 0 empty

看起来很奇怪的东西(_ZTI6classA 和_ZTI6classC 和_ZTV6classC)实际上是指向gcc 为类创建的RTTI 信息的指针。使用 -fno-rtti 表明它将分配一个空指针给 vtables 的第二个条目。很好,享受挖掘这些信息的乐趣吧。

关于c++ - 使用哪个工具查看多重继承的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394650/

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