Peu se Déplace sur un C Pointeur?
Je suis au milieu de ce projet C que je souhaite faire très efficace en terme de mémoire. Dans plusieurs cas, je suis en utilisant le void *s d'un tableau dynamique de la structure que j'ai écrit afin de tenir bits. Je souhaite utiliser l'ensemble des 64 (dans ce cas) bits.
J'ai vite réalisé que vous ne pouvez pas réellement faire toute manipulation de bits sur un pointeur. Donc ma solution est la suivante:
void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;
Ce fait le travail, mais seulement parce que, sur mon ordinateur, longs et les pointeurs sont de taille égale. Sera-ce le cas de tous (ou la plupart) des architectures?
Et ma vraie question: Est-il un plus bonne façon de faire de manipulation de bits sur un pointeur? J'avais pensé que cette approche était un peu commun dans C (emballage des bits dans un void *), mais je peux me tromper...
un uint64_t serait trop grand si votre plate-forme a moins de pointeurs 64-bit. Utilisation intptr_t et uintptr_t de le même en-tête.
On dirait que vous devez aller à travers
stdint.h
d'un peu plus près.Si votre attend à l'utiliser comme une version 64 bits du champ de bits, puis compiler pour une plate-forme 32 bits va casser des choses peu importe ce que vous le lancez. Comme je l'ai mentionné dans ma réponse ci-dessous, vous souhaitez déclarer une union de l'aiguille, avec tout ce champ de bits de taille dont vous avez besoin, de sorte que le champ est de la bonne taille, indépendamment de ce que la plate-forme cible.
Pourquoi auriez-vous besoin d'un tel pointeur de manipulations en premier lieu? Leur seul usage légitime est pour l'alignement des objectifs, et qui a des solutions qui ne nécessitent pas de casting à partir de et vers entiers.
OriginalL'auteur MADgood | 2009-12-04
Vous devez vous connecter pour publier un commentaire.
Si votre compilateur prend en charge, C99 est
<stdint.h>
en-tête donne leintptr_t
etuintptr_t
types qui doit être assez grand pour contenir un pointeur sur votre système, mais sont des nombres entiers, de sorte que vous pouvez faire de manipulation de bits. Il ne peut pas vraiment obtenir beaucoup plus portable que ça, si c'est ce que vous cherchez.Si il fait peu tourner sur un pointeur, j'espère qu'il n'est pas un déréférencement plus tard. Qui sonne comme une portabilité cauchemar. Si il faisait cela, je doute qu'il en serait de demander au sujet de la portabilité de ses opérations.
Pourriez-vous expliquer la différence(s) entre
intptr_t
etuintptr_t
?OriginalL'auteur Chris Lutz
Si vous avez besoin de faire ce genre de manipulation de pointeurs, vous pouvez les jeter à
intptr_t
etuintptr_t
, à la fois de ce qui peut être trouvé dansstdint.h
. Ces sont garantis être définie comme la plate-forme spécifique de type entier avec assez de bits pour contenir un pointeur.Il y a aussi
ptrdiff_t
là, si vous avez besoin de quelque chose pour tenir la différence entre les deux pointeurs.OriginalL'auteur tgamblin
Je pense que vous essayez de résoudre le mauvais problème. Le vrai problème est ici:
Ne pas utiliser de pointeurs void tenir bits. Utiliser void pointeurs pour contenir des pointeurs. Utiliser des entiers non signés de tenir bits.
Eh bien, vous pouvez utiliser Excel comme base de données, si vous voulez éviter le travail supplémentaire de l'apprentissage sur les bases de données, mais il sera une bonne idée sur le long terme? Sachez que de pointeur vers int conversions et à l'arrière sont complètement définie par l'implémentation, et si on ne fait pas attention à la manipulation, vous pourriez finir dans undefinded comportement. Votre structure a été prévu pour stocker des pointeurs. Pourquoi ne pas écrire un BitStore discbased spécialisés pour stocker des bits, avec tous les bits en se tournant déjà à l'intérieur, de sorte que vous n'avez pas à prendre soin d'elle à chaque appel?
-1 pour la prédication de l'OP. Sonne comme il sait ce qu'il veut.
OriginalL'auteur Secure
Déclarer une union de l'aiguille, et un champ de bits.
Vous faites le champ de bits aussi grand qu'il doit être pour vos autres fins. Le compilateur va ensuite s'assurer que la structure est assez grand de sorte que le plus grand de le pointeur et le champ de bits ajustement. Cette situation est exactement ce que les syndicats sont pour.
OriginalL'auteur Anon.