为什么空基类优化(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
这是在Visual C ++编译器的长期错误。 当一个类从多个空基类派生,只有初始空基类将使用空碱优化(EBO)进行优化。
报道微软连接这个问题在2006年: 空基地优化工作不正常。 目前,旧的错误不是在Microsoft Connect上可见。 有人告诉我,这是暂时性的问题,虽然我不知道什么时候会得到解决。 在此期间,以下是从乔纳森洞穴,谁是对的Visual C ++编译器团队的开发者之一的错误响应:
你好:不幸的是,尽管这是在Visual C ++对象模型中的错误,我们不能在这个时间来修复它因为固定它可能会打破很多现有方案为对象的大小会改变。 希望将来我们也许能够解决这个问题,但不是产品的下一个版本。
感谢您报告的问题。
“官方”的立场是MSVC将仅适用于单继承做EBO,遗憾的是在那里,这是说由MS删除了错误报告,所以这一切仍然是较旧的MSDN上的问题指向它并引用现在删除了错误报告。
由于的Visual Studio 2017年更新2, 有一个修复这个...但它默认是禁用的。 你必须明确地启用了单独的每个类 :
struct __declspec(empty_bases) Test : T1, T2, T3, T4, T5, T6 { };
// ^^^^^^^^^^^^^^^^^^^^^^^
static_assert(1 == sizeof(Test));
可悲的是,这仍然是成立的,甚至对/std:c++latest
和/permissive-
甚至在Visual Studio 2019:没有统一设置它的方式。