码迷,mamicode.com
首页 > 编程语言 > 详细

【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

时间:2015-07-17 00:19:44      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

  1. 一个空类的大小是1 byte。这是为了让这一类的两个对象得以在内存中配置独一无二的地址。

  2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据,static data members则放置的是“整个class”感兴趣的数据。

  3. C++对象模型把nonstatic data members直接放在每一个classs object之中。对于继承而来的nonstatic data members(不管是virtual 还是nonvirtual base class)也是如此。不过并没有强制定义其间的排列顺序。至于static data members,则被放置在程序的global data segment中,不会影响个别class object的大小。在程序之下,不管该class被产生出多少个objects(经由直接或间接派生),static data members永远只存在一份实例(即使该class,没有任何object实例,其static data members也已存在)。

  4. Nonstatic data members在class object中的排列顺序将和其声明的顺序一样,任何中间介入的static data member都不会被放进对象布局之中。因为静态数据成员放在data segment中,和个别的class object无关。

 

Data Member的存取

  1.如果有两个类,他们声明了同名的静态成员时,那么当它们都被放在程序的data segment时,就会导致名称冲突。编译器的解决方法是对每一个static data member编码,以获得独一无二的识别代码。

  2. Nonstatic data members直接存放在每一个class object之中。除非经由显式的或隐式class object,否则没有办法直接存取它们。只要程序员在一个member function中直接处理一个nonstatic data member。所谓的隐式就会发生。例如如下代码:

  

Point3d Point3d::translate(const Point3d &pt) {
    x += pt.x;
    y += pt.y;
    z += pt.z;
}

  表面上所看到的对于x,y,z的直接存取,事实上是经由一个”implicit class object“(由this 指针表达)完成的。事实上这个函数的参数是:

Point3d Point3d::translate(Point3d *const this, const Point3d &pt) {
    this->x += pt.x;
    this->y += pt.y;
    this->z += pt.z;
}

  欲对一个nonstaic data member进行存取操作,编译器需要把class object的起始地址加上data member的偏移位置。举个例子,如果:

origin._y = 0.0;

  那么地址&origin._y 将等于:

&origin + (&Point3d::_y - 1);

  注意其中的-1操作。指向data member的指针,其offset值总是被加上1,这样可以使编译系统区分出”一个指向data member的指针,用以指出class的第一个member“和”一个指向data member的指针,没有指出任何member“两种情况。

 

 

 

  

【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

标签:

原文地址:http://www.cnblogs.com/vincently/p/4652720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!