Représentation d'un objet en mémoire ? - C++ - Programmation
Marsh Posté le 21-10-2002 à 13:01:55
houlà... spa très propre ça, et surtout très aléatoire
Marsh Posté le 21-10-2002 à 13:09:01
antp a écrit a écrit : houlà... spa très propre ça, et surtout très aléatoire |
ha bon pourquoi ?
Marsh Posté le 21-10-2002 à 13:09:51
ben c crado, deja t pas censé acceder au membre private
t'aurais pas une fonction virtuelle qui traine, dans le code ?
Marsh Posté le 21-10-2002 à 13:16:08
chrisbk a écrit a écrit : ben c crado, deja t pas censé acceder au membre private t'aurais pas une fonction virtuelle qui traine, dans le code ? |
Si je le fais c'est pour une bonne raison
Sinon en fait ma classe Object n'est constituée que de méthodes virtuelles pures.
Marsh Posté le 21-10-2002 à 13:19:11
hellbilly a écrit a écrit : ha bon pourquoi ? |
Ton code depend de l'implementation, et meme des options de compilaton (alignement des données)...
Sinon il ne devrait pas y avoir ce décalage, sauf s'il y a au moins une fonction vituelle, ou si ton objet herite d'un autre...
Marsh Posté le 21-10-2002 à 13:23:37
hellbilly a écrit a écrit : Si je le fais c'est pour une bonne raison Sinon en fait ma classe Object n'est constituée que de méthodes virtuelles pures. |
ben voila
une fonction virtuelle te bouffe 4 octets / fonctions....
(eg le pointeur vers la fonction cible)
Marsh Posté le 21-10-2002 à 13:24:20
BENB a écrit a écrit : Ton code depend de l'implementation, et meme des options de compilaton (alignement des données)... Sinon il ne devrait pas y avoir ce décalage, sauf s'il y a au moins une fonction vituelle, ou si ton objet herite d'un autre... |
bref, dans tous les cas tu peux pas prevoir le coup, tu peux faire un code qui marchera pour l'etat actuel mais si jamais plus tard tu rajoutes une fonction virtuelle alors fodra tout recommencer....
Marsh Posté le 21-10-2002 à 13:28:40
chrisbk a écrit a écrit : ben voila une fonction virtuelle te bouffe 4 octets / fonctions.... (eg le pointeur vers la fonction cible) |
Normalement un pointeur en tout et pour tout
Il pointe sur la fameuse Vtable qui elle contient une entrée par fonction. Cette VTable est en qq sorte une variable statique, toutes les objets d'une meme classe partagent la meme....
Mais bien sur il s'agit de l'implementation la commune, d'autres sont possibles (la tienne par exemple...:D)
Marsh Posté le 21-10-2002 à 13:30:57
BENB a écrit a écrit : Normalement un pointeur en tout et pour tout Il pointe sur la fameuse Vtable qui elle contient une entrée par fonction. Cette VTable est en qq sorte une variable statique, toutes les objets d'une meme classe partagent la meme.... Mais bien sur il s'agit de l'implementation la commune, d'autres sont possibles (la tienne par exemple...:D) |
heuh ouais, effectivement, c mieux comme ca
Marsh Posté le 21-10-2002 à 13:30:58
chrisbk a écrit a écrit : bref, dans tous les cas tu peux pas prevoir le coup, tu peux faire un code qui marchera pour l'etat actuel mais si jamais plus tard tu rajoutes une fonction virtuelle alors fodra tout recommencer.... |
Est-ce que l'ordre des fonctions virtuelles a une importance ? Si par exemple j'en rajoute une mais en dernière position ca devrait pas modifier le début de l'objet. Bon normalement mon objet ne devrait plus être modifier mais on sait jamais...
Sinon je sais toujours pas pourquoi mes données se trouvent juste apres ce premier pointeur ??
Marsh Posté le 21-10-2002 à 13:32:06
hellbilly a écrit a écrit : Est-ce que l'ordre des fonctions virtuelles a une importance ? Si par exemple j'en rajoute une mais en dernière position ca devrait pas modifier le début de l'objet. Bon normalement mon objet ne devrait plus être modifier mais on sait jamais... Sinon je sais toujours pas pourquoi mes données se trouvent juste apres ce premier pointeur ?? |
Nan, cf l'explication de BENB juste au dessus
bah dans le fond c logique qu'on mette la vtable au debut. Au moins on la retrouve toujours, quelque soit les données contenues dans l'objet (pense au polymorphisme ou t'as pas une idée exacte du type de l'objet sur lequel tu bosses)
Marsh Posté le 21-10-2002 à 13:39:49
chrisbk a écrit a écrit : Nan, cf l'explication de BENB juste au dessus bah dans le fond c logique qu'on mette la vtable au debut. Au moins on la retrouve toujours, quelque soit les données contenues dans l'objet (pense au polymorphisme ou t'as pas une idée exacte du type de l'objet sur lequel tu bosses) |
c'est bon j'avais pas vu la reponse de BENB. Tout s'explique maintenant, merci !
Marsh Posté le 21-10-2002 à 14:40:48
chrisbk a écrit a écrit : Nan, cf l'explication de BENB juste au dessus bah dans le fond c logique qu'on mette la vtable au debut. Au moins on la retrouve toujours, quelque soit les données contenues dans l'objet (pense au polymorphisme ou t'as pas une idée exacte du type de l'objet sur lequel tu bosses) |
Exactement !
Se trouvent au debut de la vtable les fonctions virtuelles des classes dont on herite (je ne parles pas d'héritage multiple )
et les membres de la classe ne sont pas déplacés...
Marsh Posté le 21-10-2002 à 12:57:32
J'ai une fonction avec un argument de type pointeur sur objet. Cette fonction accède au données privées de l'objet mais ce que je pige pas c'est que je dois faire un décalage de 32 bits pour
accéder à ces variables.
Exemple :
class Object
{
private :
DWORD dw1;
DWORD dw2;
public:
Object();
~Object();
...
}
void funct(PObject pObj)
{
LPDWORD lpdw = (LPDWORD)pObj + 1;
cout << lpdw[0]; // OK.
cout << lpdw[1]; // OK.
}
Pourquoi ce + 1 ? Y a quoi juste avant la première donnée membre ?