Bedste svar
> 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
Pointersize afhænger kun af den model, hvor du kompilerer din kode. Ikke på operativsystemet. Så jeg har en 64bit Linux, men hvis jeg tvinger gcc til at kompilere 32bit-kode, får jeg 32bit ELF- og i386-kode med kun 4 bytes markørstørrelse.
Hvis du får 4 bytes på din Windows betyder det dig kompilerer stadig 32bit, og du skal finde kontakten til at frigøre maskinens fulde potentiale. Slip Kraken løs!
Jeg benchmarkede lige, at i går mellem ydeevnen af 32bit i386-kode og x86\_64 bdver2 (Piledriver, Haswell og op) kan være mere end faktor 5 på hastighedsforøgelse, ikke kun brugen af større hukommelsesmodel. Det er for det meste ikke så kritisk, 4 GB hukommelse er nok til de fleste applikationer.
Men med kun 32bit-kode begynder du at miste evnerne til MMX, SSE, SSE2,3,4 og mange fremskridt i samling over sidste 35 år. Samt hurtigere adgang til enhver dataoverførsel, bitmanipulation, strengoperationer, avancerede matematiske funktioner og, og, og, …
Mens det i nogle tilfælde er original x86-kode en fordel: du kan ikke slå kodens tæthed!
Rediger: (og en lille rant, du kan ignorere)
Okay, jeg tjekker altid værdien af sætninger sådan. Bare kompileret x86\_64 vs 8086 ældre kode. 53 byte til x88\_64 vs 74 byte på 8086 ældre kode med et lille program. Nå … Hvis du holder det på 8/16 bit, kan det være sandt. Men ikke med moderne software og c-programmer og compilere. Så ingen tårer om, at de gamle arvstider er væk. Lad os være ærlige: de var lort. Det eneste gode var, at jeg sprang ung dengang. Men det havde andre ulemper.
Pointen er: vores moderne processorer er virkelig seje. Vi har nu, hvad vi kun havde i vores drømme tilbage i 80erne. Vi har endelig store nok harddiske, at vi ikke er ligeglade med en byte eller to. Vi har stor nok hukommelse, hvis vi ikke kører Windows eller andre ressourcehogs. Vi har vektorbehandling på vores CPU og total parallel computing på vores GPUer. Vi har multicores, matematiske FPUer, specialiserede registre som i MMX, SSE, SSEx, vi fik FMA3 og FMA4 (ja, hvis du i det mindste har en AMD-processor, skal du vente længe på at få fat i det), vi fik meget sofistikerede samlingskoder, der gør alle de seje ting i mikrokode eller endda i hardware for os, ofte end ikke, bare gjort i en cyklus, vi fik cachehukommelse, der er større end noget, vi ville turde drømme om tilbage i 80erne .
Og den “kommende” ting i 80erne var cden, og ideen om at gemme mindboggingly gigabyte på en billig sølvplade var bare utænkelig. Og vi har telefoner med computere i det, der er i stand til at simulere de største mainframe-computere i 85 med faktor 10000 af deres hastighed eller noget.
Nu har vi alle de seje ting!
Men hvad laver vi med det? Vi twitterer 144 tegn. Ingen kender vidunderne til samlingskoderne til vores helt nye processorer længere. Vi klikker bare på fucking spam og kører Windows-systemer, der blev bedømt som “væk snart”, “shitty”, “hvad laver du med det crap” selv i 1985, da jeg begyndte at studere.
Det gjorde det ikke det blev ikke bedre med Windows. Det er stadig bug-ridet og malware spammed crap, der svæver over vidundere fra vores computerhardware, der er så fantastiske, at hvis du installerer et noget bedre passende OS til vores tid, vil du sprænge dit sind væk. Især som udvikler.
Udviklingen af vores processorer er langsommere med kun to konkurrenter tilbage på markedet, og det skulle være tid til virkelig at frigøre det, vi allerede har: Sluk for den 32bit lort, start med at optimere vores bibliotek kode i samling, hvor vi kan. Valgfrit, med altid et tilbagefald til ren “C”.
Og hvad fanden er Twitter? Det er en vittighed, ikke? 144 tegn ?! Det er ikke alvorligt, eller? Har de bemærket, hvilken slags hardware vi har? Intet ord imod Twitter, god service, men du ved hvad jeg mener. De tænker så skide små og fejler selv da.
Svar
Du vil hader dette svar.
Klar?
Det afhænger.
En markør er størrelsen på en adresse på den maskine, som C-programmet kompileres for.
- På Z80-mikroprocessoren, populær i 1980erne, en markør er 16 bit.
- På den originale 8086 kan en markør være 16, 20 eller 32 bit, selvom adresseområdet kun var 20 bit bredt. Du var nødt til at give C-kompilatoren et kommandolinjeargument, der sagde, hvor bred en markør skulle være. Det var et mareridt.Slå “ hukommelsesmodel ” op på wikipedia for en lang og forfærdelig introduktion.
- På 68000 mikroprocessoren var pegepinde 32 bit.
- På x86-modellen, der blev brugt til Intel-processorer indtil for omkring 5 år siden, og stadig brugbar, var en markør på 32 bit, så den kunne adressere omkring 4 GB. Denne begrænsning fører til oprettelse af 64 bit-adresser.
- På x64-modellen, der er brugt til Intel-processorer i de sidste par generationer, er en markør 64 bit.
Du kan ikke antag, at en markør har samme størrelse som en int eller den samme størrelse som en lang. Heltalskonstanten 0 kan konverteres til en markør, men andre heltalskonstanter er muligvis ikke konvertible. Når du konverterer 0 til en markør, er der ingen garanti for, at bitene i markøren alle er nuller, selvom dette er typisk. Det kunne overhovedet være hvad som helst. 0 er konverteret til en markør, der peger på ingen gyldig adresse. Du kan føje et heltal til en markør, der giver en markør, eller trække et heltal fra en markør, hvilket giver en markør. Alt andet har udefineret effekt.