2017-04-03 1 views
-1

je l'union suivante:Vecteur du pointeur vers l'union. Comment accéder correctement aux éléments de l'union?

union uval_t 
{ 
    size_t _size; 
    void* _pointer; 
    uint32_t _tid[2]; 
}; 

Si je fais maintenant ce qui suit:

std::vector<uval_t*> uvalPointerVec; 
uvalPointerVec.push_back((uval_t*)malloc(sizeof(uval_t) * 1000)); 

Comment accéder à l'ensemble de l'union correctement? Disons que ma première valeur d'union est de type size_t. Je peux le faire:

uvalPointerVec[0]->_size = 1000; 

Mais quelles sont les meilleures pratiques pour faire de l'arithmétique de pointeur avec le pointeur de l'union pour accéder aux elemets? Exemple: Puis-je faire ce qui suit pour accéder au premier pointeur d'union dans mon vecteur et accéder à l'emplacement après où mon _size a été stocké?

uvalPointerVec[0][1]->_tid[0] = 42; 
uvalPointerVec[0][1]->_tid[1] = 24; 
uvalPointerVec[0][2]->_pointer = somePointer; 

Puis-je obtenir le résultat suivant?

| 1000 | 42 | 24 | 0x... | 
^ ^
| |_First union value 
|_union pointer 

Edit: Je pense que ma question est répondu (ne pas essayer encore), mais un peu plus de contexte pour toute la confusion. J'implémente l'algèbre physique d'un système de base de données. L'opérateur Scan lit par exemple les données stockées en mémoire et enregistre tous les tuples dans une sorte de structure de données. Actuellement, l'opérateur Scan est implémenté en tant que modèle et doit fonctionner pour différentes mises en page (magasin de lignes [modèle de magasin nsh = n-ary] vs magasin de colonnes [pax = attributs de partition]). La structure de données qui stocke les tuples récupérés doit fonctionner aussi bien pour les deux mises en page. Dans NSM (par exemple, magasins de lignes), je peux accéder à un tuple par un seul pointeur sur ce tuple puisque tous les attributs sont stockés de manière consécutive. Pour l'autre mise en page j'ai besoin de deux entiers pour adresser exactement un tuple: un numéro de page et un numéro d'enregistrement sur cette page (tid). La taille est nécessaire pour certaines raisons d'optimisation dont je ne veux pas discuter maintenant. Donc, si je veux maintenant scanner une page NSM, je peux stocker des pointeurs dans ma structure de données, si je scanne une page PAX je peux réutiliser la même structure de données et au lieu de stocker des pointeurs je stocke des paires de PageNo/TupleNo.

C'est la version courte de ce que je veux réaliser

+2

"Mais quelles sont les meilleures pratiques" N'utilisez jamais de syndicats nulle part – Starl1ght

+0

La meilleure pratique pour faire de l'arithmétique de pointeur est de rester loin. Idem pour les syndicats. –

+0

Si vous voulez au moins raisonner sur vos commentaires. J'ai besoin du syndicat, si vous aimez les syndicats ou pas était pas la question. Ceci est juste un exemple minimal qui montre mon problème et je pourrais tout aussi bien essayer si mon idée fonctionne Mais ce n'est pas possible ATM et c'est pourquoi je demande ici. Aucune raison de commencer la vieille discussion ne l'utilise pas de cela. –

Répondre

2

La bonne façon serait comme ceci:

vector[i][j].member = value; 

i est l'indice à votre élément de vecteur et j être un index dans l'élément de tableau i.

Ce n'est pas pertinent à la question, mais que vous utilisez beaucoup de C plutôt que C++, je vous suggère de remplacer votre

(uval_t*)malloc(sizeof(uval_t) * 1000) 

Avec plus standard (mais pas encore desireable):

new uval_t[1000] 

ou encore mieux et plus acceptable:

std::array<uval_t, 1000>() //fixed size 
std::vector<uval_t>(1000) //resizable 

Ils sont plus sûrs et moyen plus facile de circulent, ils se libèrent également lorsque les éléments sont remplacés ou effacés.Array aura des performances et des vecteurs proches si vous vous assurez d'allouer le montant dont vous avez besoin au préalable.

+1

N'écrivez pas 'new uval_t [1000]'. N'écrivez pas du tout "nouveau". Les exemples de tableau et de vecteur sont bons. –

+0

... Je ne suis pas vraiment sûr de ce que l'OP avait l'intention ou n'avait pas l'intention de faire, cependant. Peut-être qu'ils essaient de fabriquer à la main un conteneur 2D? –

+0

Je ne peux même pas imaginer ce qu'il fait, c'est tellement bizarre. –