2010-10-08 9 views
8
#include<iostream> 
using namespace std; 
class A 
{ 

}; 
class B 
{ 
     public: 
       void disp() 
       { 
         cout<<" This is not virtual function."; 
       } 
}; 
class C 
{ 
     public: 
       virtual void disp() 
       { 
         cout<<"This is virtual function."; 
       } 
}; 
int main() 
{ 
     cout<<"class A"<<sizeof(A)<<endl; 
     cout<<"class B"<<sizeof(B)<<endl; 
     cout<<"class C"<<sizeof(C)<<endl; 
     return 0; 
} 

sizeof A y Clase B son ambos 1 byte only.What acerca de la asignación de memoria para disp función miembro en B.asignación de memoria para las funciones miembro de clase de C++

+0

¿Quiere decir por qué no tiene tamaño? igual a 1 byte? –

+0

¿cuál era el tamaño de la clase C? – KhanS

+0

Una pregunta mucho más interesante debería ser por qué A y B tienen un tamaño 1 en lugar de 0 –

Respuesta

18

Para cada instancia de la clase, la memoria se asigna solo a su miembro variables es decir, cada instancia de la clase no obtiene su propia copia de la función miembro. Todas las instancias comparten el mismo código de función miembro. Puede imaginarlo como un compilador que pasa un oculto este puntero para cada función miembro para que funcione en el objeto correcto. En su caso, dado que el estándar C++ prohíbe explícitamente objetos de tamaño 0, la clase A y la clase B tienen el tamaño mínimo posible de 1. En el caso de la clase C ya que hay una función virtual, cada instancia de la clase C tendrá un puntero a su v -table (aunque esto es específico del compilador). Entonces, el tamaño de esta clase será sizeof (puntero).

+0

Muy bien dicho. – JoshD

+0

esto también responde a una pregunta persistente que tenía seguridad de rosca re - gracias – slashmais

+1

@Martin York: El estándar prohibe objetos de tamaño 0. C++ 03 [Sección '9/3'] dice' Los objetos completos y los subobjetos miembros del tipo de clase tendrán un tamaño distinto de cero. –

1

no virtual funciones miembro no necesitan ser "asignado" a cualquier parte; en esencia, se pueden tratar como funciones normales que no son de clase con un primer parámetro implícito de la instancia de clase. No aumentan el tamaño de la clase normalmente.

0

Las funciones no virtuales no son parte de la memoria de la clase. El código para la función se procesa en el ejecutable (al igual que un miembro estático), y la memoria se asigna para sus variables cuando se llama. El objeto solo lleva los miembros de datos.

1

El tamaño de cualquier clase depende del tamaño de las variables en la clase y no de las funciones. A las funciones solo se les asigna espacio en la pila cuando se llaman y aparecen cuando regresan ... Entonces, el tamaño de una clase generalmente es la suma de tamaños de variables de miembros no estáticos ...

Cuestiones relacionadas