6
votes

Marquage / codage des pointeurs

J'ai besoin d'un moyen de marquer un pointeur comme faisant partie de la partie X ou une partie de Set Y (c.-à-d.: la balise n'a que 2 "états"), je suis ce que cela signifie que l'on peut assumer non étiquette = x et étiqueté = y.

actuellement je cherche à utiliser Bitwise Xor pour faire ceci: xxx

mais je suis exclu sur la manière de déterminer si le pointeur est étiqueté dans le premier lieu. J'utilise cela pour marquer ce que les nœuds de pools dans une liste liée proviennent, de sorte que, lorsque le moment est délié, ils peuvent revenir à des perants corrects.

Mise à jour

juste pour préciser toutes ces personnes suggérant de stocker le drapeau des membres supplémentaires de données, je suis limité à Tailleof (Void *) , donc je ne peux donc pas ajouter de nouveaux membres , sinon j'aurais. Aussi, les piscines ne sont pas contiguës, elles se composent de nombreuses pages, suivant que les gammes ajouteraient trop de frais généraux (je suis après une solution rapide et simple , si on peut l'appeler cela).


1 commentaires

Pourquoi ne pas simplement utiliser un drapeau externe bool stocké à côté du pointeur?


5 Réponses :


0
votes

Si la performance n'est pas un gros problème, deux std :: set's peuvent être utilisés.

S'il est important d'obtenir cette information rapidement et qu'il est acceptable d'utiliser uniquement des pointeurs alignés de 2 octets, le bit le plus bas peut être utilisé pour stocker ces informations. Mais avoir des pointeurs "piratés" peuvent sembler être assez sujettes à l'erreur ...


0 commentaires

9
votes

Il n'y a pas de moyen sûr et portable de faire fonctionner ce type de chose. Vous pourrez peut-être trouver des bits spécifiques au système qui sont toujours une valeur connue (par exemple, les n bits les plus importants), mais c'est une chose extrêmement fragile et dangereuse à compter sur. Vous ne pouvez pas dire si un pointeur est "marqué" ou non à moins que certains des bits du pointeur ont connu des valeurs en premier lieu.

Un bien meilleur moyen de le faire est de stocker un identifiant dans la structure que le pointeur pointe.


0 commentaires

17
votes

La plupart des solutions seront spécifiques à la plate-forme. ici quelques-uns d'entre eux:

1) Un pointeur renvoyé par MALLOC ou neuf sera aligné (4, 8, 16, 32 octets, vous le nommez). Donc, sur la plupart des architectures, plusieurs bits de LSB de l'adresse seront toujours 0.

2) et une manière spécifique Win32: à moins que votre programme utilise un commutateur 3GB, les valeurs de tous les pointeurs d'utilisateur sont inférieures à 0x80000000, de sorte que le bit le plus élevé peut être utilisé comme drapeau. En tant que bonus, il se bloque également lorsque le pointeur signalé est déréférencé sans être réparé.


1 commentaires

J'ai totalement oublié l'alignement, de sorte que cela résoudra totalement mon problème, car je peux garantir que tous les indicateurs soient alignés sur un minimum de 4 :)



0
votes

Vous pourriez avoir PTR1 ^ Magic = PTR2 avec PTR1 dans Set X et PTR2 dans Set Y (sauf si vous ne le prouvez autrement). Depuis (je suppose), vous n'avez pas de contrôle sur les adresses des pointeurs que vous avez données, votre technique semble être inadéquate.

Une alternative à la solution Vinay consiste à stocker les étiquettes sous forme de bits d'un tampon pré-alloué (spécialement facile si la taille de la liste est borné puisque vous n'avez pas à cultiver ou à réduire le tampon). Il s'agit d'une solution très compacte et efficace qui n'a pas besoin de modifier la structure de données pointue.

acclamations,

-stan


0 commentaires

2
votes

Sûrement Si vous avez seulement deux piscines, lorsque vous allouez une mémoire pour chaque piscine, vous connaissez la plage d'adresses possibles - alors pourquoi ne pas vérifier si votre pointeur donné se produit dans une ou plusieurs gammes d'adresses avec un pointeur simple arithmétique?


0 commentaires