Meilleure réponse
> cat pointersize.c
#include
int main(){
int *ip;
printf(“pointer size: \%zu\n”, sizeof(ip));
}
> cc -o pointersize pointersize.c
> ./pointersize
pointer size: 8
> cc -m32 -o pointersize pointersize.c
> ./pointersize
pointer size: 4
La taille du pointeur dépend uniquement du modèle sous lequel vous compilez votre code. Pas sur le système dexploitation. Jai donc un Linux 64 bits, mais si je force gcc à compiler du code 32 bits, jobtiens du code ELF 32 bits et i386 avec seulement 4 octets de taille de pointeur.
Si vous obtenez 4 octets sur votre Windows, cela signifie que vous compilez toujours 32 bits et vous devriez trouver le commutateur pour libérer tout le potentiel de votre machine. Libérez le Kraken!
Je viens de faire un benchmark quhier, entre les performances du code 32 bits i386 et x86\_64 bdver2 (Piledriver, Haswell et plus) peuvent être plus dun facteur 5 sur le gain de vitesse, pas seulement lutilisation du modèle de mémoire plus grand. Ce nest généralement pas si critique, 4 Go de mémoire suffisent pour la plupart des applications.
Mais avec seulement un code 32 bits, vous commencez à perdre les capacités de MMX, SSE, SSE2,3,4 et de nombreux progrès dans lassemblage par rapport au 35 dernières années. Ainsi que laccès plus rapide pour tout transfert de données, manipulation de bits, opérations de chaînes, fonctions mathématiques avancées, et, et, et,…
Alors que dans certains cas, le code x86 dorigine est un avantage: vous ne pouvez pas battre la rigueur du code!
Edit: (et un petit coup de gueule, vous pouvez ignorer)
Daccord, je vérifie toujours la valeur de phrases comme ça. Juste compilé le code hérité x86\_64 vs 8086. 53 octets pour x88\_64 vs 74 octets sur le code hérité 8086 avec un petit programme. Eh bien… Si vous le gardez à 8/16 bits, cela pourrait être vrai. Mais pas avec les logiciels modernes, les programmes C et les compilateurs. Donc, pas de larmes sur le fait que les temps anciens de lhéritage sont partis. Soyons honnêtes: c’était de la merde. La seule bonne chose était que jétais jeune et pétillante à lépoque. Mais cela avait dautres inconvénients.
Le fait est que nos processeurs modernes sont vraiment cool. Nous avons maintenant ce que nous navions que dans nos rêves dans les années 80. Nous avons enfin des disques durs suffisamment grands pour que nous ne nous soucions pas d’un octet ou deux. Nous avons suffisamment de mémoire, si nous ne conduisons pas Windows ou d’autres ressources. Nous avons un traitement vectoriel sur notre CPU et un calcul parallèle total sur nos GPU. Nous avons des multicœurs, des FPU mathématiques, des registres spécialisés comme MMX, SSE, SSEx, nous avons FMA3 et FMA4 (enfin, si vous avez un processeur AMD au moins, vous devez attendre longtemps pour mettre la main dessus), nous obtenu des opcodes dassemblage très sophistiqués qui font tout ce dont nous avons besoin en microcode ou même en matériel, bien souvent quautrement, juste en un seul cycle, nous avons une mémoire cache plus grande que tout ce dont nous aurions osé rêver dans les années 80 .
Et la chose «à venir» dans les années 80 était le CD et lidée de stocker des gigaoctets stupéfiants sur une plaque dargent bon marché était tout simplement inimaginable. Et nous avons des téléphones avec des ordinateurs capables de simuler les plus gros ordinateurs centraux de 85 par facteur 10000 de leur vitesse ou quelque chose du genre.
Maintenant, nous avons tous les trucs sympas!
Mais que faisons-nous avec? Nous twitterons 144 caractères. Personne ne connaît plus les merveilles des opcodes dassemblage de nos tout nouveaux processeurs. Nous cliquons simplement sur le putain de spam et chassons les systèmes Windows, qui ont été classés «bientôt partis», «merdiques», «que faites-vous de cette merde» même en 1985, quand jai commencé à étudier.
Ça na pas été le cas Ça ne sest pas vraiment amélioré avec Windows. C’est encore de la merde bourrée de bogues et de spammeurs de logiciels malveillants, qui monopolise les merveilles de notre matériel informatique, qui sont si incroyables que, si vous installez un système d’exploitation mieux adapté à notre époque, vous serez ébloui. Surtout en tant que développeur.
Le développement de nos processeurs ralentit avec seulement deux concurrents sur le marché et il devrait être temps de vraiment libérer ce que nous avons déjà: éteignez cette merde 32 bits, commencez à optimiser notre code de bibliothèque dans lassemblage où nous pouvons. Facultatif, avec toujours un retour au «C» pur.
Et quest-ce que Twitter? C’est une blague, non? 144 caractères?! Ce n’est pas grave, ou? Ont-ils remarqué le type de matériel dont nous disposons? Aucun mot contre Twitter, bon service, mais vous savez ce que je veux dire. Ils pensent tellement petit et échouent même alors.
Réponse
Vous allez détester cette réponse.
Prêt?
Cela dépend.
Un pointeur est la taille dune adresse sur la machine pour laquelle le programme C est compilé.
- Sur le microprocesseur Z80, populaire dans les années 1980, un pointeur est de 16 bits.
- Sur le 8086 dorigine, un pointeur peut être de 16, 20 ou 32 bits, même si lespace dadressage na que 20 bits de large. Vous deviez donner au compilateur C un argument de ligne de commande indiquant la largeur dun pointeur. Cétait un cauchemar.Recherchez « modèle de mémoire » sur wikipedia pour une introduction longue et horrible.
- Sur le microprocesseur 68000, les pointeurs étaient 32 bits.
- Sur le modèle x86 utilisé pour les processeurs Intel jusquà il y a environ 5 ans, et toujours utilisable, un pointeur était de 32 bits, lui permettant dadresser environ 4 Go. Cette limitation conduit à la création dadresses 64 bits.
- Sur le modèle x64 utilisé pour les processeurs Intel des dernières générations, un pointeur est 64 bits.
Vous ne pouvez pas Supposons quun pointeur a la même taille quun int, ou la même taille quun long. La constante entière 0 peut être convertie en pointeur, mais les autres constantes entières peuvent ne pas être convertibles. Lorsque vous convertissez 0 en pointeur, il ny a aucune garantie que les bits contenus dans le pointeur seront tous des zéros, bien que ce soit typique. Ça pourrait être nimporte quoi. 0 est converti en un pointeur qui pointe vers aucune adresse valide. Vous pouvez ajouter un entier à un pointeur, ce qui donne un pointeur, ou soustraire un entier à un pointeur, ce qui donne un pointeur. Tout le reste a un effet indéfini.