Membres inscrits :668
Membres en ligne : 0
Invités en ligne : 8


|
| Conversation (Résolue) : Accès binaire aux membres d'une classe, alignement & co... |
hx (Membre)
Inscrit le : 21-09-2010
Messages: 35
Snippets: 0
Tutoriels: 0
Hors ligne |
Salut,
J'ai une question de base que je ne m'étais jamais posé jusque là, voila :
Comment se comporte l'acces "binaire" aux membre d'une classe ?
Par exemple si j'ai une classe :
Code Cpp:class cVect { public: float x; float y; float z; cVect(); ~cVect(); };
Que je déclare un objet vs ainsi :
Code Cpp:
Et que j'appel une fonction void test(void *ptr); ainsi :
Code Cpp:
* Puis je considérer du coup la classe comme une simple "structure" binaire (un empilement des membres de type standard) pour accéder aux membres de la classe ?
Par exemple, puis je faire ceci (enfin est ce autorisé ?) :
Code Cpp:void test(void *ptr){ float *p=(float *)ptr; cout << p[0] << p[1] << p[2] << endl; }
est ce que ((float *)ptr)[0] correspond bien a x ?
* Et dans le cas ou les membres sont private ou protected ? sont il toujours accessible ainsi ?
* Comment se comporte l'alignement dans ce cas ? (comme pour une structure ou union ?)
* N'y a t'il pas de données "binaire" supplémentaires pour la gestion de la classe par le compilateur ?
Bref vous aurez compris, j'ai besoin de réutiliser des tableaux de classes C++ dans des fonctions en C sans avoir a reformater la "strucutre binaire" de ses classes. Si quelqu'un peut m'aider a y voir un peu plus claire...
Merci d'avance
Hx
---------------------------------------- Re,
Je reformule mon problème, par exemple : - J'ai une classe vecteur qui me permet de me simplifier la vie. (elle comporte entre autre les coordonnées x,y,z, quelques flags et methodes utiles) - J'ai donc des tableaux de vecteurs qui permettent de décrire des objets 3D. - A un moment je dois donner OpenGL un tableau de float, comment faire :
* La première idée c'est de traiter tout le tableau de vecteur pour en constituer un nouveau, seulement pour l'occasion, correctement formaté de triplet "float". C'est facile mais ca alourdis le traitement et démultiplie les données.
* La seconde idée est de déclarer une structure vecteur directement (plutôt qu'une classe) et jouer avec l'alignement de opengl. Mais dans ce cas je perds le coté pratique et secure de l'utilisation sous forme de classe C++. Je me dis qu'il doit y avoir plus élégant que m'obliger a travailler sur une structure C ou de remanier les données d'une classe C++.... ?
Quelqu'un a une idée ?
Hx
Dernière modification par hx (13-12-2010 18:05:29)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1191
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Salut.
Tu peux toujours faire le test, mais c'est très risqué.
Par principe, une classe est une structure pouvant contenir des méthodes, ainsi que des membres privés. Si tu as besoin d'un accès "binaire", il vaut mieux te limiter à la structure. Et dans le cas d'une classe, tu peut toujours avoir un accès binaire à ses membres publics.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
hx (Membre)
Inscrit le : 21-09-2010
Messages: 35
Snippets: 0
Tutoriels: 0
Hors ligne |
Salut,
Un grand merci pour ta réponse Xaviou, je confirme, c'est très risqué. J'ai lu que sur certains compilateurs ésotériques (enfin avec certaines options activées) des octets de "service" étaient ajoutés en tête du chunk...
A++
Hx
| |
|
|