寒假过完了,回到学校,开始了新的一轮学习。寒假还是像以前那样带回去基本书,作为心理安慰。既然来学校了,就要让安慰变成现实。我给你一个的计划,一个月最少看完一本书。并做适当的总结。计划的第一本书《深入探索C++对象模型》。寒假看了点,就算从2月1日开始的。在二月份要把这本书看完。可以提前,但是不可以拖。

       今天上午终于在实验室看了一上午的书,没有开电脑上网。对我来说是个不小的突破(在实验室看不下去书),今天主要看了,第3章:Data 语意学;就在写这篇文章的时候感觉忘差不多了。

 一.

      class X{};

      class Y:public virtual X{};

      class Z:public virtual X{};

      class A:public Y,public Z{};

 

       1.一个class X内没有含明显的数据,但是sizeof X的结果是1.  事实上并不是空,它有一个隐晦的1 byte,那是被编译器安***去的一个char。这使的这个class的不同objects得以在内存中配置独一无二的地址。

       2.Y和Z的大小是8 byte。受到三个因素影响:

              (1)语言本身所造成的额外负担(overhead);

              (2)编译器对于特殊情况所提供的优化处理;

              (3)Alignment的限制。

 

二.Data Member的绑定(The Binding of a Data Member)

        extern float x;

        class Point3d

       {

        public:

                  Point3d( float ,float,float);

                 / /被传回和被设定的x是哪一个x呢,早期的c++编译器,和现在的,分别

                  float X() const { return x;}  

              void X(float new_x) const { x = new_x ;}

       private:
                float x,y,z;

       }

      1.早期C++的两种防御性程序设计风格:

            (1)把所有的data members 放在class声明起头处,以确保正确的绑定。

            (2)把所有的inline function,不管大小都放在class声明之外。

               因为"一个inline的函数实体,在整个class声明中未被完全看见之前,是不会被评估求值(evaluated)的。"

      2.

       typedef int length;

 

       class Point3d

       {

       public:

                 void mumble(length val) { _val=val ; }

                 length mumble() { return _val; }

       private:

                 typedef float length;

                  length _val;

        };

 

       //解释这个class中得length;

三.Data Member的布局(Date Member Layout)

     1.

             class Point3d

            {

             private:

                       float x;

                       static List<Point3d*> *freeLis;

                       float y;

                       static const int chunkSize =250;

                       float z;

             }

          问题:解释这个class object的布局(排列顺序)