考虑如下代码:
class X{};
class Y : public virtual X{};
class Z : public virtual X{};
class A : public Y, public Z{};
cout << sizeof(X) << sizeof(Z) << sizeof(Y) << sizeof(A) ;
结果为:1 8 8 16;
class X{};
并不是空的,它有一个隐藏的1byte大小,那是被编译器安插进去的一个char
;
对于Y
和Z
; 这个大小和机器有关,也和编译器有关系,事实上收到如下几个因素影响
- 语言本身所造成的额外负担
- 编译器对于特殊情况所提供的优化处理
- Alignment的限制 class Y和Z的大小截至目前为5bytes.在大部分机器上,聚合的结构体大小会受到
alignment
的限制,使它们能够更有效的在内存中被读取,在我们机器上,alignment,是8bytes,所以classY和Z必须填补3bytes。
alignment就是將数值调整某数的整数,在64位的计算机上通常aligement为8bytes