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
  • 相关阅读:
    redis持久化之AOF和RDB
    pycharm快捷键
    500系列错误
    400系列错误
    Linux常用命令大全
    从浏览器输入一个地址,发送请求,经历了哪些过程(面试问题)
    401的错误分析
    301和302的区别
    数据库 语法收集 (主 mysql,次oracle,日常积累)
    python 发送邮件 smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') 以及授权码设置步骤
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053763.html
Copyright © 2011-2022 走看看