Почему оптимизация пустого базового класса (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).
Эта проблема была зарегистрирована в Microsoft Connect в 2006 году: Оптимизация пустой базы не работает должным образом. На данный момент старые ошибки не видны в Microsoft Connect. Мне сказали, что это временная проблема, хотя я не знаю, когда она будет решена. А пока что ответ на ошибку Джонатана Кейвса, одного из разработчиков команды по компиляции Visual C ++:
Привет: к сожалению, даже несмотря на то, что это ошибка в объектной модели Visual C ++, в настоящее время мы не можем ее исправить, учитывая, что исправление может привести к поломке многих существующих программ, так как размеры объектов будут меняться. Надеемся, что в будущем мы сможем решить эту проблему, но не до следующей версии продукта.
Спасибо за сообщение о проблеме.
«Официальная» позиция — MSVC будет выполнять EBO только для одиночного наследования, к сожалению, отчет об ошибке, где указано, что был удален MS, так что все, что осталось, — это более старая версия. вопрос по MSDN это указывает на это и ссылается на теперь удаленный отчет об ошибке.