15

为什么空基类优化 (EBO) 没有在 Visual C++ 中得到充分应用?

如果我有很多基类,有什么办法可以帮助编译器进行这种优化?

#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
4

3 回答 3

18

这是 Visual C++ 编译器中长期存在的错误。当一个类派生自多个空基类时,只有初始的空基类将使用空基优化 (EBO) 进行优化。

2006 年在 Microsoft Connect 上报告了此问题: 空基优化无法正常工作。 目前,旧错误在 Microsoft Connect 上不可见。我被告知这是一个临时问题,虽然我不知道什么时候会解决。同时,以下是来自 Visual C++ 编译器团队的开发人员之一 Jonathan Caves 对该错误的回应:

嗨:不幸的是,尽管这是 Visual C++ 对象模型中的一个错误,但我们目前无法修复它,因为修复它可能会破坏许多现有程序,因为对象的大小会发生变化。希望在未来我们能够解决这个问题,但不能用于产品的下一个版本。

感谢您报告问题。

于 2012-10-03T18:03:56.593 回答
8

“官方”的立场是 MSVC 只会为单一继承做 EBO,不幸的是,说明这一点的错误报告已被 MS 删除,所以剩下的只是MSDN 上的一个较旧的问题,指出它并引用现在删除的错误报告。

于 2012-10-03T06:52:26.077 回答
8

Visual Studio 2017 Update 2以来,有一个修复程序......但默认情况下它是禁用的。而且您必须分别为每个类显式启用它:

    struct __declspec(empty_bases) Test : T1, T2, T3, T4, T5, T6 { };
    //     ^^^^^^^^^^^^^^^^^^^^^^^

    static_assert(1 == sizeof(Test));

/std:c++latest可悲的是,/permissive-即使在Visual Studio 2019中,这仍然适用:没有办法在全局范围内设置它。

于 2019-04-05T07:36:35.360 回答