首页 > 代码库 > 深入探索C++对象模型->3续

深入探索C++对象模型->3续

一、

1、对于以下模型,你期望中的每个class会占用多少内存呢?

1 class X{};2 class Y : public virtual X {};3 class Z : public virtual X {};4 class A : public Y, public Z{};5     6 std::cout<<sizeof(X)<<" "<<sizeof(Y)<<" "<<sizeof(Z)<<" "<<sizeof(A);

看到每个class没有明显的数据,会理所当然地认为每个class大小都应该是0。然后事实并非如此,即使class X也不为零。

2、对于class X,它有一个隐藏的1byte大小,那是被编译器安插进去的一个char。这使得这一class的两个objects得以在内存中配置独一无二的地址。

3、对于class Y和Z,Y和Z不做优化时是8,做优化时是4。先来解释Y和Z受到哪些因素影响。

  ①:语言本身锁造成的额外负担:当语言支持virtual base classes时,就会造成一些额外负担。它表现在某种形式的指针上,它或者指向virtual base class subobject,或者指向一个相关表格。

  ②:编译器对于特殊情况提供的处理:class X的1bytes大小也会出现在class Y和Z身上。

  ③:Alignment的限制:class Y和Z的大小截止目前为止是5bytes。在大部分机器上,聚合的结构体大小会受到alignment的限制,使它们能够更有效率地在内存中被读取。alignment = 4bytes,所以Y和Z必须填补3bytes。最终得到8bytes。

二、empty virtual base class优化:

  1、某些新近的编译器对empty virtual base class提供了特殊处理。在这个策略下,一个empty virtual base class被视为derived class object最开头的一部分,也就是说它并没有花费任何的额外空间。这就节省了上述②的1bytes。所以Y和Z的大小都是4而不是8.

三、class A的内存期望是多少呢?

  

深入探索C++对象模型->3续