当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>《深度摸索C++对象模子》读书笔记(3)</b>[VC/C++编程]

赞助商链接



  本文“<b>《深度摸索C++对象模子》读书笔记(3)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在visual C++ 6.0中测试以下代码:

#include "iostream"
using namespace std;

class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y,public Z {};

int main()
{
    cout<<"sizeof(X): "<<sizeof(X)<<endl;
    cout<<"sizeof(Y): "<<sizeof(Y)<<endl;
    cout<<"sizeof(Z): "<<sizeof(Z)<<endl;
    cout<<"sizeof(A): "<<sizeof(A)<<endl;

    return 0;
}

得出的后果大概会令你毫无眉目

sizeof(X): 1
sizeof (Y): 4
sizeof(Z): 4
sizeof(A): 8

下面一一阐释缘由:

(1)关于 一个class X这样的空的class,由于需求使得这个class的两个objects得以在内存中配置举世无双的地 址,故编译器会在此中安插进一个char.因而class X的大小为1.

(2)由于class Y虚拟担当于 class X,而在derived class中,会包含指向visual base class subobject的指针(4 bytes),而由 于需求辨别这个class的差别对象,因而virtual base class X subobject的1 bytes也呈目前class Y中 (1 bytes),此外由于Alignment的限制,class Y必须弥补3bytes(3 bytes),这样一来,class Y的 大小为8.

需求注意的是,由于Empty virtual base class已经成为C++ OO计划的一个特有术语, 它供应一个virtual interface,没有定义任何数据.visual C++ 6.0的编译器将一个empty virtual base class视为derived class object最开首的一部份,因而省去了后来的1 bytes,自然也不存在背面 Alignment的问题,故实际的履行后果为4.

(3)不管它在class担当体系中呈现了多少次,一个 virtual base class subobject只会在derived class中存在一份实体.因此,class A的大小有以下几 点决意:(a)被大家同享的唯一一个class X实体(1 byte);(b)Base class Y的大小,减去 “因virtual base class X而配置”的大小,后果是4 bytes.Base class Z的算法亦同. (8bytes)(c)classs A的alignment数目,前述总和为9 bytes,需求弥补3 bytes,后果是12 bytes.

考虑到visual C++ 6.0对empty virtual base class所做的处理,class X实体的那1 byte将被拿掉,于是额外的3 bytes弥补额也没必要了,故实际的履行后果为8.

不管是自身class的 还是担当于virtual或nonvirtual base class的nonstatic data members,其都是直接存放在每个class object之中的.至于static data members,则被安排在程序的一个global data segment中,不会影响 个别的class object的大小,并永久只存在一份实体.

***Data Member的绑定***

早期 C++的两种防备性程序计划气势的由来:

(1)把全部的data members放在class声明起头处,以 确保精确的绑定:

class Point3d
{
// 在class声明起头处先安排全部的data member
float x,y,z;
public:
float X() const { return x; }
// ...
};


  以上是“<b>《深度摸索C++对象模子》读书笔记(3)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .