为什么空基类优化不起作用?

时间:2012-10-03 03:26:53

标签: c++ visual-c++ optimization empty-class

为什么在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

3 个答案:

答案 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-仍然如此:无法全局设置它。