ventajas usar simple polimorfismo multiple interfaces herencia desventajas como clase abstracta c++ visual-studio multiple-inheritance memory-layout

c++ - usar - ¿Por qué la herencia múltiple aumenta el tamaño del objeto a pesar de que las bases están vacías?



polimorfismo java (2)

La Actualización 2 de Visual Studio 2015 agregó soporte para la optimización de clase base vacía. Sin embargo, como se supone que las Actualizaciones son compatibles con el diseño entre ellas, la optimización no está activada de forma predeterminada; necesitas solicitarlo manualmente usando __declspec (empty_bases).

Hay más información en el blog de VC: https://blogs.msdn.microsoft.com/vcblog/2016/03/30/optimizing-the-layout-of-empty-base-classes-in-vs2015-update-2-3/

Este será el predeterminado una vez que lancen una actualización importante de la versión del compilador, donde se les permita romper la compatibilidad binaria.

Dado este código:

#include <iostream> struct A { }; struct B { }; struct C { }; struct E : A { int field; }; struct F : A, B { int field; }; struct G : A, B, C { int field; }; int main() { std::cout << _MSC_VER << std::endl; std::cout << sizeof(E) << std::endl; std::cout << sizeof(F) << std::endl; std::cout << sizeof(G) << std::endl; int o; std::cin >> o; return 0; }

Me dan la siguiente salida:

1900 4 8 8

¿Por qué F y G tienen tamaños de 8 aunque sus bases estén vacías? ¿Y por qué el tamaño de E no aumenta también?

Estoy creando esto con Visual Studio Community 2015, versión 14.0.25431.01, actualización 3. La versión de MSVC ++ es aparentemente 9.0.

¿Cómo? ¿Qué razón hay para un diseño de memoria tan peculiar?


No hay una regla de idioma que diga que cualquier tipo en particular debe tener un tamaño en particular, con la excepción de char (tamaño 1), y sujeto a la restricción de que los objetos completos de tipo de clase tienen un tamaño distinto de cero. No hay ningún problema con la forma en que su compilador en particular establece los tipos en su ejemplo.

En cuanto a la nueva pregunta, después de editarla: es posible que MSVC simplemente no haga un gran esfuerzo para optimizar la herencia múltiple, porque es una cosa relativamente rara que se podría argumentar que hay pocos beneficios. No sé nada sobre el verdadero proceso de decisión que se llevó a cabo, pero solo considero que puede haber compromisos de ingeniería pragmáticos como este en juego.