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...

Je voudrais utiliser un uint64_t au lieu de stdint.h
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