bueno, vamos a probarlo todo. Puedo compilar, con optimizaciones completos, un ejemplo más completo de este modo:
void use(int &);
class classWithInt
{
public:
classWithInt() : someInt(){}
int someInt;
};
class podWithInt
{
public:
int someInt;
};
int main() {
int foo;
classWithInt bar;
podWithInt baz;
use(foo);
use(bar.someInt);
use(baz.someInt);
return 5;
}
Y esta es la salida que recibo de gcc-llvm
; ModuleID = '/tmp/webcompile/_21792_0.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-linux-gnu"
%struct.classWithInt = type { i32 }
define i32 @main() {
entry:
%foo = alloca i32, align 4 ; <i32*> [#uses=1]
%bar = alloca %struct.classWithInt, align 8 ; <%struct.classWithInt*> [#uses=1]
%baz = alloca %struct.classWithInt, align 8 ; <%struct.classWithInt*> [#uses=1]
%0 = getelementptr inbounds %struct.classWithInt* %bar, i64 0, i32 0 ; <i32*> [#uses=2]
store i32 0, i32* %0, align 8
call void @_Z3useRi(i32* %foo)
call void @_Z3useRi(i32* %0)
%1 = getelementptr inbounds %struct.classWithInt* %baz, i64 0, i32 0 ; <i32*> [#uses=1]
call void @_Z3useRi(i32* %1)
ret i32 5
}
declare void @_Z3useRi(i32*)
Hay algunas diferencias en cada caso. En el caso más simple, el POD type difiere del int plano en una sola forma, requiere una alineación diferente, está alineado en 8 bytes en lugar de solo 4 bytes.
La otra cosa notable es que el POD y el desnudo int no se inicializan. Su almacenamiento se usa justo como está desde el desierto de la pila. El tipo no pod, que tiene un constructor no trivial, hace que se guarde un cero antes de que la instancia se pueda usar para cualquier otra cosa.
Las clases son The Devil. Nunca deberías usarlos. Todo su código debe estar en un único y enorme módulo con muchas funciones, y debe usar tipos simples en variables globales. En una nota relacionada; Debo dejar de visitar este sitio cuando me siento especialmente sarcástico. : p –
¿Por qué no intentar crear 100 clases y 100 ints? ¡o incluso un millón de ints! – PostMan
¿Lo has probado y perfilado? ¿Por qué eso importa? ¿Por qué harías esto? Apuesto a que es cientos de veces más lento, pero tu compilador PODRÍA hacer algunas cosas elegantes. ¿Qué caso de uso tienes que lo haga relevante? – Falmarri