SizeOf - Ereditarietà multipla con virtual

di il
1 risposte

SizeOf - Ereditarietà multipla con virtual

Salve ragazzi sto avendo un problema utilizzando le funzioni virtuali ( polimorfismo run-time ) .
Il problema lo riscontro con la sizeof dei miei oggetti .
Sto studiando dell'ereditarietà multipla con le classi "Person" , "Student" , "Employee" e "Student-Employee" . Le relazioni sono : student e employee derivano da person e student-employee deriva da student ed employee .
Sono presenti funzioni virtuali e quindi un aumento di 4byte della sizeof , dovuto al puntatore alla vtable e inoltre un aumento di 4byte dovuto al puntatore all'istanza di classe person contenuto in student ed employee ( ereditarierà virtuale ) .

Le mie classi e il main seguono :

class Person {
public:
	char no[5];


	Person(){
		cout << "p" <<endl;
	}
	virtual void DoSomething(){
		cout << "1"<<endl;
	}
	void inserisci_nome(char insnm[5]){
		strcpy(no, insnm);
	}

};

class Student : virtual public Person {
public:

	Student(){
		cout << "s" <<endl;
	}
	void DoSomething(){
		cout << "2"<<endl;
	}



};

class Employee : virtual public Person {
public:
	Employee(){
		cout << "e" <<endl;
	}
	void DoSomething(){
		cout << "3"<<endl;
	}

};

class Student_Employee : public Student,
	public Employee {

public:
	Student_Employee(){
		cout << "se" <<endl;

	}


	void DoSomething(){
		cout << "4"<<endl;
	}
};

int main(){

	Person P ;
	Student S;
	Employee E;
	Student_Employee SE;

	cout << sizeof(P)<<endl;
	cout << sizeof(S)<<endl;
	cout << sizeof(E)<<endl;
	cout << sizeof(SE)<<endl;

system("pause");
	return 0;
}

I risultati che ottengo sono :
P->12
S->20
E->20
SE->24

Non riesco a giustificare tali valori delle sizeof. Spero qualcuno più esperto di me possa aiutarmi.Grazie in anticipo .

1 Risposte

  • Re: SizeOf - Ereditarietà multipla con virtual

    Credo che la spiegazione sia fortemente dipendente dal compilatore in uso e dalle opzioni di compilazione.
    Comunque di base devi quantomeno considerare qual è l'allineamento delle strutture (e quindi anche classi); per questioni di ottimizzazione queste difficilmente sono allineate a 1 byte quindi spesso ci sono dei byte di padding all'interno (es. la tua stringa di 5 caratteri in realtà potrebbe occupare 8 byte...).
    Ti consiglio comunque di provare con diversi compilatori e in diversi ambienti.
Devi accedere o registrarti per scrivere nel forum
1 risposte