2012-10-03 8 views
13

¿Por qué la optimización de clase base vacía (EBO) no se aplica completamente en Visual C++?¿Por qué la optimización de la clase base vacía no funciona?

Si tengo muchas clases base, ¿hay alguna forma de ayudar al compilador a realizar esta optimización?

#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 
+1

¿Está compilando en modo de depuración? – jpm

+0

@jpm: No, está en modo de lanzamiento. – Mehrdad

+0

Cualquier optimización que afecte el diseño de la memoria tendría que hacerse de manera consistente en todas las unidades de compilación. Así que esto tendría que ser obligatorio o no, en absoluto, de una manera similar a por qué el compilador no puede reordenar los miembros de struct/class. – Mysticial

Respuesta

18

Este es un error de larga data en el compilador de Visual C++. Cuando una clase se deriva de múltiples clases base vacías, solo la clase base vacía inicial se optimizará utilizando la optimización de base vacía (EBO).

Este problema se informó en Microsoft Connect en 2006: Empty Base Optimization Not Working Properly. Por el momento, los errores antiguos no son visibles en Microsoft Connect. Me dijeron que este es un problema temporal, aunque no sé cuándo se resolverá. Mientras tanto, la siguiente es la respuesta al fallo de Jonathan Cuevas, quien es uno de los desarrolladores en Visual C++ equipo compilador:

Hola: lamentablemente a pesar de que este es un error en el Visual C++ modelo de objetos no podemos solucionarlo en este momento dado que corregirlo podría potencialmente romper muchos programas existentes ya que los tamaños de los objetos cambiarían. Es de esperar que en el futuro podamos abordar este problema, pero no para la próxima versión del producto.

Gracias por informar del problema.

+0

I siempre resulta interesante cómo los enlaces de MSDN se rompen justo cuando * realmente * los necesita, al menos planean arreglarlo ... – Necrolis

+0

Esto todavía es un problema en VS2017. Sin embargo, se puede eludir con un poco de trabajo manual de acuerdo con esta [publicación de blog] (https://blogs.msdn.microsoft.com/vcblog/2016/03/30/optimizing-the-layout-of-empty-base- classes-in-vs2015-update-2-3 /). Desde VS2015 Actualización 2, es posible agregar '__declspec (empty_bases)' a la declaración de clase derivada para aplicar la aplicación de EBO en múltiples escenarios de herencia. Esto tiene que hacerse manualmente para mantener la compatibilidad binaria. – w1th0utnam3

8

La postura 'oficial' es MSVC sólo lo hará EBO para la herencia simple, por desgracia, el informe de error cuando así se indique sido eliminada por la EM, por lo que todo lo que queda es una más antigua question on MSDN que apunta hacia fuera y referencias las ahora borrado informe de errores.

Cuestiones relacionadas