2012-02-26 37 views
12

Quiero saber la descripción detallada sobre el tamaño de una clase. Quiero saber si solo hay miembros de datos & miembro sin ninguna palabra clave virtual, entonces por qué el tamaño de clase depende solo de los miembros de datos. Para un ejemplo:¿Por qué el tamaño de clase depende solo de los miembros de datos y no de las funciones de miembros?

class A { 
    int a; 
public: 
    int display() { 
    cout << "A=" << a << endl; 
    } 
}; 

Cuando compruebo la sizeof(A) i encontrado que es de 4 bytes. ¿Por qué es así? ¿Por qué la función miembro no tiene ningún efecto en el tamaño de la clase A?

Gracias

+0

Eche un vistazo a [esta respuesta stackoverflow] (http://stackoverflow.com/questions/9439240/sizeof-class-with-int-function-virtual-function-in-c). Debería aclarar tus dudas. – vvnraman

Respuesta

13

Debido a que las funciones de la clase no se guardan en el interior del propio objeto. Piénselo en términos de programación C, cada función de la clase A toma un parámetro secreto, el este puntero, por lo que en realidad son solo funciones con un parámetro adicional.

Por ejemplo imaginemos que de esta manera:

int display(A* thisptr) 
{ 
    //do something 
    printf("%d",thisptr->a); 
    return; 
} 

Por lo tanto la función de visualización se guarda como sólo una simple función con un parámetro adicional. Sin embargo, el nombre está destrozado dependiendo del compilador.

Creo que se aplican reglas diferentes para las funciones virtuales que implican indicadores de función, pero como no estoy seguro, tal vez alguien más nos puede informar sobre este asunto.

2

Al igual que una función C normal, un método C++ es solo una dirección en la memoria para que la ejecución salte cuando se llame. La única diferencia es el primer parámetro, que es un puntero al objeto desde el que está llamando a la función.

4

Esto depende de la implementación, no está especificado en el estándar. Sin embargo, tiene razón, las funciones de miembros no virtuales (e incluso las funciones virtuales después del primero) no afectan el tamaño de la clase.

Eso es porque usaría mucha memoria si cada instancia de la clase tuviera punteros para todas las funciones. ¿Y por qué lo harían? En tiempo de ejecución, el objeto sabe de qué tipo es y puede llamar a la función adecuada. Y la misma función es idéntica en todas las instancias, todo lo que es diferente es el objeto en el que opera, que se pasa como un parámetro debajo del capó.

1

Porque el estado de la función se va en la pila, y se crea/elimina al entrar/salir la función.

En el tamaño del objeto solo están los miembros que contribuyen al almacenamiento del estado del objeto. Una función es solo una pieza de código que comienza en un punto determinado que no depende de la instancia de objeto particular a la que se refiere.

Piense a

A a1, a2; 

A1.a y A2.a son diferentes, pero a1.display() y a2.dispaly() es el mismo código de función (piense a int A::display()) como int display(A* this))

3

Las funciones/métodos se almacenan como código, no como datos. Al igual que un archivo ejecutable se almacena como un archivo único, y puede iniciarse varias veces, y varias instancias del mismo tendrían datos .Del mismo modo, una función es código ejecutable, y los datos que le pasa pueden ser diferentes (como documentos diferentes, para el mismo software de procesamiento de textos).

El código ejecutable no tendrá ningún sizeof, ya que no ocupan espacio en la pila o en el montón, mientras el programa se está ejecutando. Se almacena en la imagen ejecutable y el sistema operativo la carga una vez cuando inicia el programa.

2

Con la excepción de los miembros ocultos de datos introducidos para implementar funciones virtuales y herencia virtual, el tamaño de la instancia está determinado únicamente por los miembros de datos de una clase y las clases base. De C++: Under the Hood (1994) En caso de que desee saber más.

2

Las funciones miembro son parte del segmento de texto de un proceso y los objetos son parte del segmento de datos del proceso. Entonces, como los objetos son solo datos, calcula el tamaño agregando todos los tamaños de miembros de datos de una clase. Las funciones miembro son comunes para todos los objetos, solo se diferencian por el primer argumento del puntero de los objetos en particular (llamado este puntero) que se pasa como el puntero oculto a cada función miembro de la clase.

Cuestiones relacionadas