MSVC 对多继承下的 EBO 支持的一个 workaround
首先简单介绍一下 EBO(Empty Base Class Optimization)。
因为 C++ 规定,任何一个 instance 在内存中必须要有唯一的地址,因此一个空的 class/struct 会在编译时被偷偷插入一个外人看不到的 char mem;
,于是这个空类的每一个 instance 都可以有一个唯一的地址了。
但是如果将这个空类作为某个类的成员时,这个隐藏的成员会被计入内存布局之中,考虑到 memory padding,有时候会导致类对象体积膨涨一倍。
例如考虑:
1 | class E {}; |
我们会发现每一个 A1
的 instance 都占了 8-byte,比起 4-byte 足足翻了一倍。
占用内存无端变大导致 cache 问题啥的就不讲了,这方面的内容任何讲 computer architecture 的书应该都会有。