zoukankan      html  css  js  c++  java
  • 《深度探索C++对象模型》第三章 Data语意学

    首先给出以下例子:
    这里写图片描述

    class X{};
    class Y:public virtual X{};
    class Z:public virtual X{};
    class A:public Y,public Z{};
    sizeof(X);//1
    sizeof(Y);//8
    sizeof(Z);//8
    sizeof(A);//12

    Y,Z的内存大小受三个因素的影响:
    1.语言本身造成的额外负担,指的是虚继承中在类中会产生一个指向虚表的指针,这个指针在32位的系统下是4个字节。
    2.编译器对特殊情况提供的优化处理。
    3.alignment限制。
    Class A的大小由以下几点决定
    1.被共享的 class X,为1字节。
    2.class Y的大小,要减去因virtual base class X而配置的大小,结果是4bit,Z同理,Y+Z=8。
    3.class A自身是0字节。
    4.class A的内存对齐,8+1=9字节,要调整为4的边界,需要补充3个字节,所以结果是12个字节。


    Data member的布局
    Static data members只有一个实体,存放在程序的data segment中,每次程序取用static member,都会被内部转化为对该唯一的extern实体的直接参考操作。

    Origin.chunkSize=50;
    //等价于这个
    Point3d::chunkSize=50;

    若取一个static data member的地址,会得到一个指向其数据类型的指针,而不是一个指向其class member 的指针,因为static member并不内含在一个class object之中。

    &Point3d::chunkSize;//会得到const int*类型

    如何区分一个”没有指向任何data member“的指针和一个指向”第一个data member“的指针?例如:

    float Point::*p1=0;
    float Point::*p2=&Point::x;
    if(p1==p2)
    {
    //do something..
    }

    为了区分p1和p2,每一个真正的member offset值都要加上1,如果要使用该值来指出一个member,要先减去1.


    指向members的指针的效率问题
    为每一个“member存取操作”加上一层间接性(经由已经绑定的指针)会使得执行时间多出1倍不止,以“指向member的指针”来存取数据,再一次几乎用掉了双倍的时间,要把“指向member的指针”绑定到class object上,需要额外地把offset减去1.

    https://github.com/li-zheng-hao
  • 相关阅读:
    如何使页面中的INPUT按指定的顺序移动焦点{转}
    Eclipse把包引入到项目中的方法
    mssqlserver和sqlexpress的区别{转}
    WPF中动态加载XAML中的控件
    修改Eclipse的智能感知设置
    格式化包括字符串, 数字, 日期, 枚举等类型数据的格式化
    ASP.NET身份验证机制membership入门——配置篇(1){转}
    JAVA基础总结{转}
    asp.net mvc的生命周期{转}
    使用开源免费类库在.net中操作Excel{转}
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053763.html
Copyright © 2011-2022 走看看