深度探索C++对象模型 3Data语意学

2014-11-24 07:38:42 · 作者: · 浏览: 0

第三章 Data语意学

已知如下程序:

#include

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) << endl;

cout << sizeof(Y) << endl;

cout << sizeof(Z) << endl;

cout << sizeof(A) << endl;

return 0;

}

在VS2008上执行结果如下:

\

一个空的class如X,事实上不是空的。因为空类也可以被实例化,就必须被分配内存,所以编译器默认分配给他一个字节(安插进去了一个char,故大小为1byte)以便标记初始化的类实例,同时使空类占用的空间也最少。

Y和Z的大小受到三个因素的影响:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+MS4gICAgICDT79HUsb7J7cv51OyzybXEtu7N4ri6taOjurWx0+/R1Nans9Z2aXJ0dWFsIGJhc2UgY2xhc3Nlc7vydmlydHVhbGZ1bmN0aW9uyrGjrL7Nu+HU7LPJtu7N4ri6taOho9XiwO9Zus1ayc+2vNT2vNPBy9K7uPbWuNXro6i089Chzqo0Ynl0ZXOjqaOs1rjP8nZpcnR1YWwgYmFzZSBjbGFzcyBYIHN1Ym9iamVjdKGjPC9wPgo8cD4yLiAgICAgILHg0uvG97bU09rM2Mrix+m/9sv5zOG5qbXE08W7r7SmwO2jutPQ0Km0q82zseDS68b3u+G9q3ZpcnR1YWwgYmFzZSBjbGFzcyBYIHN1YmplY3S1xDFieXRltPPQobfF1NpYus1Zyc+jrLb409DQqbHg0uvG96OoyOdWUzIwMDijrFZDJiM0MzsmIzQzOyA2LjCjqdLyzqpZus1a0tG+rdPQ0ru49ta41eu1xLTz0KHWuM/ydmlydHVhbCBiYXNlY2xhc3MgWCBzdWJqZWN0o6y/ydLUyM/Oqlm6zVqyu8rHv9XA4KOsvs2yu9Do0qqx4NLrxvfAtMn6s8kxYnl0ZaGjPC9wPgo8cD4zLiAgICAgIEFsaWdubWVudLXEz97WxqO6YWxpZ25tZW50vs3Kx72ryv0mIzIwNTQwO7X31fu1vcSzyv21xNX7yv2xtqGj1NozMs67vMbL47v6yc+jrM2os6PKxzRieXRlcygzMs67KaOs0tTKuWJ1c7XE1MvK5MG/tO+1vdfuuN/Qp8LKoaM8L3A+CjxwPsv50tRZus1atcS089Ch1NpWUzIwMDjJz86qNNfWvdqho8jnz8LNvMv5yr6jujwvcD4KPHA+PGltZyBzcmM9"https://www.cppentry.com/upload_files/article/49/1_cwdv9__.jpg" alt="\">

而如果这段程序在传统编辑器上,则大小为8字节(4字节的指针+1字节+3字节的Alignment填充),如下图所示:

对于class A,在传统编辑器上大小由以下几点决定:

1. 被大家共享的唯一一个class X实例,大小为1byte。

2. Baseclass Y的大小,减去“因virtual base class X而配置”的大小,结果是4byte。Base classZ也一样。加起来是8bytes。

3. Class A自己的大小:0byte

4. Class A的alignment数量,前面三项加起来是9bytes,故需要填充4bytes。结果为12。

但在VS2008上,class X的1byte被拿掉,故无需额外的3byte填充,所以大小为8bytes。

C++ Stand并不强制规定如“base classsubject的排列顺序”或“不同存取层级的data members的排列顺序”,也不规定virtualfunction或virtual base class的实现细节,这些实现都由编译器产商自定。

在这一章,class的data members以及class hierarchy是中心议题。对于nonstaticdata member(不论是否继承而来)都放置于每一个class object中,但没有定义他们之间的排列顺序。至于staticdata member,则被放置在程序的一个global data segmen中,只存在一份实例,不会影响class object的大小。

未完待续。。。