<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |