Perché l’ottimizzazione della class base vuota non funziona?

Perché l’ottimizzazione della class base vuota (EBO) non viene completamente applicata in Visual C ++?

Se ho un sacco di classi base, c’è qualche modo per me per aiutare il compilatore a fare questa ottimizzazione?

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

Questo è un bug di lunga data nel compilatore di Visual C ++. Quando una class deriva da più classi di base vuote, solo la class base vuota iniziale verrà ottimizzata usando l’EBO (Empty Base Optimization).

Questo problema è stato segnalato in Microsoft Connect nel 2006: l’ ottimizzazione di base vuota non funziona correttamente. Al momento, i vecchi bug non sono visibili su Microsoft Connect. Mi è stato detto che si tratta di un problema temporaneo, anche se non so quando sarà risolto. Nel frattempo, quanto segue è la risposta al bug di Jonathan Caves, che è uno degli sviluppatori del compilatore Visual C ++:

Ciao: sfortunatamente anche se questo è un bug nel modello di oggetti di Visual C ++, non siamo in grado di risolverlo in questo momento dato che il fixing potrebbe spezzare un sacco di programmi esistenti al variare delle dimensioni degli oggetti. Speriamo che in futuro potremmo essere in grado di risolvere questo problema ma non per la prossima versione del prodotto.

Grazie per aver segnalato il problema.

La posizione “ufficiale” è che MSVC eseguirà EBO solo per ereditarietà singola, sfortunatamente la segnalazione di bug in cui viene affermato è stata cancellata dalla MS, quindi rimane solo una vecchia domanda su MSDN che la evidenzia e fa riferimento alla segnalazione di bug ora eliminata.