为什么在Visual C ++中没有完全应用空基类优化(EBO)?
如果我有很多基类,有没有办法让我帮助编译器进行这种优化?
#include <iostream>
struct T1 { };
struct T2 { };
struct T3 { };
struct T4 { };
struct T5 { };
struct T6 { };
struct Test : T1, T2, T3, T4, T5, T6 { };
int main() { std::cout << sizeof(Test); } // Prints 5
答案 0 :(得分:18)
这是Visual C ++编译器中长期存在的错误。当一个类派生自多个空基类时,只使用空基优化(EBO)优化初始空基类。
2006年Microsoft Connect上报告了此问题:Empty Base Optimization Not Working Properly.目前,Microsoft Connect上不会显示旧错误。我被告知这是一个临时问题,但我不知道什么时候会解决。与此同时,以下是对Jonathan Caves的错误的回应,Jonathan Caves是Visual C ++编译器团队的开发人员之一:
嗨:遗憾的是,即使这是Visual C ++对象模型中的一个错误,我们也无法在此时修复它,因为修复它可能会破坏很多现有程序,因为对象的大小会发生变化。希望将来我们可以解决这个问题,但不能解决产品的下一个版本问题。
感谢您报告此问题。
答案 1 :(得分:8)
'官方'立场是MSVC只会进行单一继承的EBO,不幸的是,MS所删除的错误报告已被删除,所以剩下的就是一个较旧的question on MSDN指出并引用了现在删除了错误报告。
答案 2 :(得分:1)
自 Visual Studio 2017 Update 2 起,为此there is a fix ...,但是默认情况下已禁用。 而且您必须分别为每个类明确启用它:
struct __declspec(empty_bases) Test : T1, T2, T3, T4, T5, T6 { };
// ^^^^^^^^^^^^^^^^^^^^^^^
static_assert(1 == sizeof(Test));
遗憾的是,即使在{strong> Visual Studio 2019 中,/std:c++latest
和/permissive-
仍然如此:无法全局设置它。