C++ 中的对象布局

C++中的涉及到虚表时,类对象的布局分为:虚表与数据成员,子类包含派生类布局,假设下面一个程序:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class B {
 6 private:
 7     int a;
 8 public:
 9     B() {
10         a = 11;
11     }
12
13     virtual void fun() {
14         cout << "B::fun" << endl;
15     }
16 };
17
18 class A:public B {
19 public:
20     A() {
21         cout << "class A constructor" << endl;
22         m = 3;
23         n = 2;
24     }
25
26     ~A() {
27         cout << "~A()" << endl;
28     }
29     virtual void fun() {
30         cout << "A::fun" << endl;
31     }
32
33 private:
34     int m,n;
35 };
36
37 int main(int argc, char *argv[])
38 {
39     A a;
40     int *p;
41     typedef void (*pf_t)(void);
42
43     pf_t pf;
44     p = static_cast<int *>((int *)&a);
45     pf = (pf_t)p;
46
47     int *vptr = *(int **)&a;
48     int *vtable = (int *)*vptr;
49     pf = (pf_t )vtable[2];
50
51     printf("address A::fun %p\n",pf);
52
53     cout << "p:" << *p << endl;
54     p ++ ;
55     cout << "p:" << *p << endl;
56     p++;
57     cout << "p:" << *p << endl;
58     p++;
59     cout << "p:" << *p << endl;
60
61     p++;
62     cout << "p:" << *p << endl;
63
64
65     return 0;
66 }

通过VS 2010显示对象布局图(cl -d1reportAllClassLayout),其中meta为对应对象的类型信息:

类B:

 1 class B    size(8):
 2     +---
 3  0    | {vfptr}
 4  4    | a
 5     +---
 6
 7 B::[email protected]:
 8     | &B_meta
 9     |  0
10  0    | &B::fun

类A:

class A    size(16):
    +---
    | +--- (base class B)
 0    | | {vfptr}
 4    | | a
    | +---
 8    | m
12    | n
    +---

A::[email protected]:
    | &A_meta
    |  0
 0    | &A::fun

A::fun this adjustor: 0
时间: 2024-10-10 01:42:18

C++ 中的对象布局的相关文章

VS中C++对象的内存布局

本文主要简述一下在Visual Studio中C++对象的内存布局,这里没有什么测试代码,只是以图文的形式来描述一下内存分布,关于测试的代码以及C++对象模型的其他内容大家可以参考一下陈皓先生的几篇博文以及网上的其他一些文章: <C++虚函数表解析>:http://blog.csdn.net/haoel/article/details/1948051 <C++对象的内存布局(上)>:http://blog.csdn.net/haoel/article/details/3081328

Qt之美(一):d指针/p指针详解(二进制兼容,不能改变它们的对象布局)

Translated  by  mznewfacer   2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持一下Xizhi Zhu,在引用一下Jerry Sun的话,“C++需要宏定义就像需要设计模式一样.也许你不知道,宏是图灵完全(turing complete)的,至少LISP下是这样,C/C++需要宏,几乎所有重要的C/C++库都需要和依赖宏.这些都超过咱们的想象,宏能带给我们所谓语法糖(Synta

第五篇:在SOUI中使用XML布局窗口

窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定义一个控件在主窗口的位置.对于窗口是固定大小的界面来说,这种方式是最简单有效的. 然而问题在于在Windows系统上编程,基本上很少有程序的窗口是固定大小的,用户希望它的窗口能够随时调整大小.调整大小后界面里的控件还能够按照一定的规则进行重排. 我自己最讨厌的就是在WM_SIZE里重排控件位置. 随

ASP.NET内容页中访问母版页中的对象

在ASP.NET2.0开始,提供了母版页的功能.母版页由一个母版页和多个内容页构成.母版页的主要功能是为ASP.NET应用程序中的页面创建相同的布局和界面风格.母版页的使用与普通页面类似,可以在其中放置文件或者图形.任何HTML控件和Web控件.后置代码等. 母版页仅仅是一个页面模板,单独的母版页是不能被用户所访问的.母版页和内容页有着严格的对应关系.母版页中包含多少个ContentPlaceHolder控件,那么内容页中也必须设置与其对应的Content控件. 回顾了母版页的概念后,我今天主要

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()

进阶篇-用户界面:3.android中的基本布局-layout

1.RelativeLayout       在RelativeLayout中,组件可以根据父级边界进行定位,除了这样的定位,也可以相对其他控件进行定位.特点是,可以随意拖动空间,拖到哪里就停到哪里. 代码中添加子对象: import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.RelativeLayout; import android.widget.Text

C++ 类继承的对象布局

C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如class C:public B,public A此种情况布局如下: 如果class B,A带有虚函数,情况又发生了变化: 考虑下面的情况: class D { int d; public: virtual void fun() {} virtual ~D() {} }; class E { publ

Android中的五大布局和logcat打印日志

在android中的布局有五大类,有的时候你可能用到一种,但有的时候你也可能需要两种或者三种布局同时一起使用.这五种布局为别为:LinearLayout(线性布局),FrameLayout(框架布局),RelativeLayout(相对布局),TableLayout(表格布局),AbsoluteLayout(坐标布局): LinearLayout:被称为线性布局,分为水平和垂直,设置的垂直或水平的属性值,来排列所有的子元素.所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元

基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象

1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧.文字和标注等图形对象都是对象. 线型与标注样式等样式设置都是对象. 图层.编组和块等组织结构都是对象. 视图与视口等图形显示都是对象. 甚至图形和 AutoCAD 应用程序本身也是对象. 2.CAD中的容器:对于任何一个DWG文件,都会创建下列容器对像:九个固定的符号表(如下)和有名对像字典(包含