以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  [转帖]C++对象的内存映像  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=125386)


--  作者:happem
--  发布时间:8/18/2012 3:33:00 PM

--  [转帖]C++对象的内存映像
什么是[URL=http://www.lirenedu.org/index.php?ack=xinwen&id=303]对象模型?要想理解它,必须把C++语言层面的面向对象特征和概念与对象的底层实现技术结合起来进行分析。前者如构造函数、拷贝和赋值函数、析构函数、静态成员、虚函数、继承、组合、动态创建对象、RTTI等。后者则是语言是实现隐藏起来的细节,如对象的内存映像、vtable的构造、vptr的插入和初始化时机、构造和析构函数的自动调用时机、对象的构造和析构次序、临时对象的创建和销毁、RTTI的底层实现技术,等等。

对象模型涉及的内容非常之多,构成了一套完整的语言实现体系,我们不可能讲述其中的每一个主题,仅进行粗浅的介绍,以起到抛砖引玉的作用。

了解对象首先要知道对象在内存中的布局,也就是对象在内存中如何存放和表示的。这里我们简单阐述一下C++类的内存映像。

  Class rectangle

{  pibilc:

    Rectangle();m-length(1),m-width(1){……}

    ~rectangle(){…}

     Float getlength()const{return m-length;}

     void setlength(float length){m-length;}

     float getwidth()const{return m-width;}

     void setwidth(float width){m-width=width};

     void draw(){….}

static unsigned int getcount(){return m-count;}

protected:

rectangle(const rectangle©){….}

rectangle& operator=(const rectangle& assign){….}

private:

float m-length;  //长

float m-width;   //宽

static unsigned int m-count; //对象计数

};

Rectangle这种基本的C++对象模型有下述几个规则:

1  非静态数据成员被放在每一个对象体内作为对象专有的数据成员;

2  静态数据成员被提取出来放在程序的静态数据区内为该类所有对象共享,因此仅存在一份;

3  静态和非静态成员函数最终都是被提取出来放在程序的代码段中并为该类的所有对象共享,因此每个成员函数也只存在一份代码实体;

4  类内嵌套定义的各种类型与放在类外面定义的类型除了作用域不同外没有本质区别。

因此,构成对象本身的只有数据,任何成员函数都不隶属任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。
资源来自:http://www.lirenedu.org/index.php?ack=xinwen&id=1145


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
52.734ms