在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
微软的Visual Studio 2008(VS2008)提供了一个新的选项,给用户显示C++对象在内存中的布局。 这个选项就是/d1reportSingleClassLayout。 具体使用方法如下,在写好相应的cpp文件之后,需要启动VS2008的命令行工具“Visual Studio 2008 Command Prompt”,切换到cpp文件所在目录之后,输入如下的命令: cl [filename].cpp /d1reportSingleClassLayout[className]
cl当然就是MS的编译器咯;[filename].cpp就是你所想要查看的class所在的cpp文件(class定义在头文件也没关系,还是只要编译cpp文件即可);而你需要在最后加上[className],也就是你需要查看的class的类名。 【举例】 Test.cpp文件代码如下:
#include <iostream>
using namespace std; class Base { public: int a; virtual void fcn() {}; }; class Derived : public Base { public: virtual void fcn2() {}; private: int d; void fcn3() { } }; int main(void) { } 我想查看Derived这个类的对象在内存中的布局,那么就可以用下面的命令行。 cl Test.cpp /d1reportSingleClassLayoutDerived
结果显示如下:
可以看到class Derived的对象的内存布局,在派生类对象的开始包含了基类Base的对象,其中有一个虚表指针,指向的就是下面的Derived::$vftable@ (virtual function table),表中包含了Derived类中所有的虚函数。 【再举一例】 下面是一个经典的虚继承的菱形继承结构的代码:
#include <iostream>
using namespace std; class Base { public: int a; virtual void fcn1() {}; }; class Derived1 : public Base { public: int b; virtual void fcn2() {}; }; class Derived2 : public Base { public: int c; virtual void fcn3() {}; }; class Child : virtual public Derived1, virtual public Derived2 { public: int d; virtual void fcn4() {} ; }; int main(void) { } 其对应的显示结果则如下: 其中{vbptr}表示虚继承的虚基类指针。然后这个Child类其实有三个虚函数表指针(图中的三个{vfptr}),下面则分别给出了虚基类指针和三个虚函数表指针的具体内容。其中的那些负数表示这些指针举例对象起始位置的offset。 ============================================= 最后加一句,我并不支持这种非要深入研究对象内存布局的行为,再说这种布局完全是由编译器决定的,GCC的内存布局很可能就完全不同。这个对提高C++水平并没有多大的益处。点到为止。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论