c ++ sizeof () de una clase con funciones

Tengo una pregunta en C ++. Escribí la siguiente clase:

class c { int f(int x, int y){ return x; } }; 

el sizeof () de la clase c devuelve “1”. Realmente no entiendo por qué regresa 1.

Tratando de entender mejor lo que está pasando, agregué otra función:

 class c { int f(int x, int y){ return x; } int g(int x, int y){ return x; } }; 

¡Ahora lo siguiente realmente me confundió! sizeof (c) sigue siendo 1 (!?!?!?!). Entonces creo que las funciones no cambian el tamaño de la clase, ¿pero por qué ??? y ¿por qué el tamaño es 1? ¿Y es específico del comstackdor?

¡Gracias! 🙂

La clase no contiene miembros de datos, por lo que está vacía. El estándar exige que todas las clases tengan al menos el tamaño 1, así que eso es lo que obtienes. (Las funciones de miembro no están físicamente “dentro” de una clase, en realidad son solo funciones gratuitas con un argumento oculto y un espacio de nombres y control de acceso).

Su tamaño es de 1, porque no puede ser 0; de lo contrario, dos objetos de este tipo no serían direccionables (no podrían diferenciar sus direcciones)

Las funciones de miembro son, esencialmente, las mismas que las funciones normales, simplemente ocultan this parámetro. Por lo tanto, cada instancia de un tipo determinado no necesita llevar copias de sus funciones miembro; el comstackdor simplemente realiza un seguimiento de las funciones regulares y proporciona un parámetro adecuado para usted. Así que no importa cuántas funciones tenga un tipo dado, no hay necesidad de que cambie su tamaño. Cuando entra en herencia complicada con funciones virtuales y otras cosas, esto cambia ligeramente, pero al final la cantidad de funciones continúa sin afectar el tamaño final del objeto.

El tamaño inicial de un byte se debe a que todos los objetos deben ocupar un espacio, de modo que puede garantizarse que no haya dos objetos que ocupen el mismo espacio. Considere una matriz … a[5] es lo mismo que *(a + 5) , y al agregar a un puntero aumenta la dirección de memoria por el tamaño del objeto. si sizeof(a) fuera 0 , entonces todos los elementos de la matriz colapsarían hasta la misma dirección.

Que el tipo de objetos de algún espacio es obligatorio por el estándar … que el tamaño sea exactamente igual a uno no lo es. sizeof(c) en su caso podría ser 23, pero no hay razón para ello.

Para completar, es posible que un subobjeto tenga un tamaño de cero. La optimización de base vacía permite que una clase base no ocupe ninguna memoria real si no es necesario. Así que sizeof(Base) == sizeof(Derived) podría ser cierto, aunque Derived formalmente contiene una instancia de Base oculta dentro de él. Esto está permitido por el estándar, pero no es obligatorio … MSVC, por ejemplo, no lo usa en algunas situaciones.

1 significa 1 byte. Y la resonancia es que los métodos no se almacenan dentro de un objeto. Son utilizados por objetos, pero no almacenados en ellos. Solo los miembros de la clase se almacenan en objetos. Intenta agregar un miembro int plano o algo y ver qué pasa.

sizeof (char) == 1 siempre, porque un char es un byte y sizeof devuelve una cantidad de bytes. (Sin embargo, un byte no es necesariamente exactamente ocho bits).

Totalmente cierto. De ahí el término “octeto” (para distinguir algo que es exactamente 8 bits del término más comúnmente usado “byte”).

Para obtener más información, consulte IEEE 1541:

http://en.wikipedia.org/wiki/IEEE_1541

P: ¿Las funciones virtuales toman espacio por objeto y, por lo tanto, aumentan el tamaño de un objeto?

R: No. Cuantas más funciones virtuales, más grande es vtable. Cuantas más subclases, más vtables. Si una clase no tiene funciones virtuales, entonces no hay necesidad de un vtable o un puntero vtable (por objeto).

Pero nada de esto afecta a “sizeof”. Las funciones en sí mismas toman una cantidad fija de espacio, independientemente.

Porque su clase es una “variable de referencia” y, por MSDN: “El operador sizeof nunca arroja 0 incluso para una clase vacía”.

EJEMPLO:

 #include  

clase C
{
público:
int f (int x, int y) {return x; }
int g (int x, int y) {return x; }
};

estructura
{
int f;
int g;
};

En t
main (int argc, char * argv [])
{
c objc;
s objs;
printf (“sizeof (c) =% d, sizeof (objc) =% d, sizeof (clase c) =% d … \ n”,
sizeof (c), sizeof (objc), sizeof (clase c));
printf (“sizeof (s) =% d, sizeof (objs) =% d, sizeof (struct s) =% d … \ n”,
sizeof (s), sizeof (objs), sizeof (struct s));
return 0;
}

RESULTADO:

 sizeof (c) = 1, sizeof (objc) = 1, sizeof (clase c) = 1 ...
 sizeof (s) = 8, sizeof (objs) = 8, sizeof (struct s) = 8 ... 

Tenga en cuenta también la diferencia entre “struct” y “class”.

Aquí hay más información:

http://www.geekinterview.com/question_details/42847