Espero que se den cuenta de que todo esto está profundamente definido en la implementación, tanto para Java como para C ++. Dicho esto, el modelo de objetos de Java requiere bastante espacio.
Los objetos C ++ no necesitan (generalmente) ningún almacenamiento, excepto lo que necesitan los miembros. Tenga en cuenta que (a diferencia de Java, donde todo lo definido por el usuario es un tipo de referencia), el código del cliente puede usar objetos como tipo de valor o como tipos de referencia, es decir, un objeto podría almacenar un puntero / referencia a otro objeto, o almacenar el objeto directamente sin indirección Es necesario un puntero adicional por objeto si hay algún virtual
método, pero algunas clases útiles están diseñadas para llevarse bien sin polimorfismo y no lo necesitan. No hay metadatos GC ni bloqueo por objeto. Por lo tanto, los class IntWrapper { int x; public: IntWrapper(int); ... };
objetos no necesitan más espacio que los simples int
, y se pueden colocar directamente (es decir, sin indirección) en colecciones y otros objetos.
Las matrices son complicadas simplemente porque no hay un equivalente común prefabricado a una matriz de Java en C ++. Simplemente podría asignar un grupo de objetos con new[]
(sin sobrecarga / metadatos) pero no hay un campo de longitud; la implementación probablemente almacena uno pero no puede acceder a él. std::vector
es una matriz dinámica y por lo tanto tiene una sobrecarga adicional y una interfaz más grande. std::array
y matrices de estilo C (int arr[N];
), necesita una constante de tiempo de compilación. En teoría, debería ser solo el almacenamiento del objeto más un número entero para la longitud, pero dado que puede obtener un cambio de tamaño dinámico y una interfaz con todas las funciones con muy poco espacio extra, simplemente vaya por eso en la práctica. Tenga en cuenta que todas estas, así como todas las demás colecciones, predeterminan el almacenamiento de los objetos por valor, lo que le ahorra indirección y el espacio para referencias, y mejora el comportamiento de la memoria caché. Debe almacenar explícitamente los punteros (los inteligentes, por favor) para obtener la indirección.
Las comparaciones anteriores no son del todo justas, porque algunos de estos ahorros se obtienen al no incluir las características que incluye Java, y su equivalente de C ++ a menudo está menos optimizado que el equivalente de Java (*). La forma común de implementar virtual
en C ++ impone exactamente la misma sobrecarga que la forma común de implementar virtual
en Java. Para obtener un bloqueo, necesita un objeto mutex con todas las funciones, que probablemente sea más grande que unos pocos bits. Para obtener el recuento de referencia ( noequivalente a GC, y no debe usarse como tal, pero a veces útil), necesita un puntero inteligente que agregue un campo de recuento de referencia. A menos que el objeto se construya con cuidado, el recuento de referencias, el objeto de puntero inteligente y el objeto de referencia están en ubicaciones completamente separadas, e incluso cuando lo construye correctamente, el puntero compartido puede (¿debe?) Seguir siendo dos punteros en lugar de uno. Por otra parte, un buen estilo de C ++ no utiliza estas características lo suficiente como para que importe: en la práctica, los objetos de una biblioteca de C ++ bien escritos usan menos. Eso no necesariamente significa menos uso de memoria en general, pero sí significa que C ++ tiene una buena ventaja en este sentido.
(*) Por ejemplo, puede obtener llamadas virtuales, códigos hash de identidad y bloqueo con solo una palabra para algunos objetos (y dos palabras para muchos otros objetos) fusionando la información de tipo con varios indicadores y eliminando bits de bloqueo para objetos que son Es poco probable que necesite cerraduras. Para obtener una explicación detallada de esta y otras optimizaciones, vea Implementación eficiente en tiempo y espacio del modelo de objetos Java (PDF) de David F. Bacon, Stephen J. Fink y David Grove.
int
? Si es así, debe comparar eso conint
Java, noInteger
, siempre que sus entradas C ++ sean de 32 bits.