为什么空基类优化(EBO)在MSVC中不起作用? 为什么空基类优化(EBO)在Visual C++ + 中没有充分应用?

为什么空基类优化(EBO)在MSVC中不起作用? 为什么空基类优化(EBO)在Visual C++ + 中没有充分应用?,c++,visual-c++,compiler-optimization,empty-class,C++,Visual C++,Compiler Optimization,Empty Class,如果我有很多基类,有没有办法帮助编译器进行优化 #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 #包

如果我有很多基类,有没有办法帮助编译器进行优化

#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
#包括
结构T1{};
结构T2{};
结构T3{};
结构T4{};
结构T5{};
结构T6{};
结构测试:T1,T2,T3,T4,T5,T6{};

int main(){STD::Cuff[P]:“官方”的立场是MSVC只对单个继承进行EBO,不幸的是,MS所述的bug报告被删除,所以剩下的是一个更大的点,并引用现在删除的bug报告。

< P>这是VisualC++编译器中的一个长期错误。pty基类,只有初始空基类将使用空基类优化(EBO)进行优化

这个问题在2006的微软Connect上被报道:目前,在微软Connect上不可见老bug。我被告知这是一个暂时性的问题,虽然我不知道它何时会被解决。同时,下面是对VisualC++编译器中的开发者之一的Jonathan Caves的bug的回应。eam:

很不幸,尽管这是VisualC++对象模型中的一个bug,但我们现在无法修复它,因为修复它可能会破坏许多现有的程序,因为对象的大小会发生变化。希望将来我们能够解决这个问题,而不是为下一个版本的产品提供解决方案。 谢谢你报道这个问题


自Visual Studio 2017更新2以来,对此…默认情况下已禁用。 您必须分别为每个类显式启用它:

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

    static_assert(1 == sizeof(Test));

不幸的是,即使是在Visual Studio 2019中,
/std:c++latest
/permissive-
也是如此:没有办法全局设置它。

你是在调试模式下编译的吗?嗯……我没看到你有6个…这让事情变得更糟了…@Mystical:是的,如果你算一算,是7个d类。这就是为什么它让我困惑的原因lol。(有趣的是,当你嵌套它们时,它似乎也不会消失。我有一堆空类,每个都有1-2个基类,但它们都是从彼此继承的,并且对象最终都是30个字节!!),可能这是MS特定的行为,或者必须设置调试标志。这种行为是boost运算符使用基类链接而不是简单地让用户执行多重继承的原因。我总是发现有趣的是,MSDN链接在您真正需要时会断开,至少他们计划修复它…这在VS2017中仍然是一个问题。Ho然而,根据这一点,可以通过一些手动工作来避免。自VS2015更新2以来,可以向派生类声明中添加
\u declspec(空基)
,以强制在多继承场景中应用EBO。这必须手动完成,以保持二进制兼容性。