C++-----深度探索对象模型-第三章-Data语意学(四)

1、如果打开优化开关,封装就不会带来执行期的效率成本。

2、如下代码:

class Point3d{
public:
    virtual ~Point3d();
    //...
protected:
    static Point3d origin;
    float x,y,z;
};

    每一个Point3d 类对象含有三个坐标值,依次序为x,y,z以及一个vptr,static变量会被放在类对象之外。不同的编译器的区别是vptr有可能放在对象的头或者尾。

//取一个类的成员变量的地址,得到的其实是一个偏移量
&Point3d::z    

    在这里实际测试和书上有点差异,取一个类的成员变量的地址的时候,应该像下面这样

//获得成员对于类的偏移量
	int Base::*ptr = &Base::a;
	int Base::*ptr2 = &Base::b;

3、运行如上代码输出偏移量结果并没有加1,其原因可能是,VS编译器做了特殊处理。

4、对偏移量加1是为了区分没有指向任何数据成员的指针和指向第一个数据成员的指针。如下代码:

float Point3d::*p1=0;

//x是第一个数据成员,那么取地址的结果也是0,这样就无法和上面区分,所以加1 
float Point3d::*p2=&Point3d::x;

 

posted @ 2019-05-27 09:55  吾之求索  阅读(101)  评论(0)    收藏  举报