Qual è la dimensione di un puntatore in C?

Migliore risposta

> 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 dimensione del puntatore dipende solo dal modello in base al quale si sta compilando il codice. Non sul sistema operativo. Quindi ho un Linux a 64 bit, ma se forzo gcc a compilare codice a 32 bit, ottengo codice ELF a 32 bit e i386 con una dimensione del puntatore di soli 4 byte.

Se ottieni 4 byte su Windows significa che stai ancora compilando a 32 bit e dovresti trovare linterruttore per liberare tutto il potenziale della tua macchina. Scatena il Kraken!

Ho appena valutato che ieri, tra le prestazioni del codice i386 a 32 bit e x86\_64 bdver2 (Piledriver, Haswell e versioni successive) possono essere più del fattore 5 sul guadagno di velocità, non solo lutilizzo del modello di memoria più grande. Per lo più non è così critico, 4 GB di memoria sono sufficienti per la maggior parte delle applicazioni.

Ma con solo il codice a 32 bit inizi a perdere le capacità di MMX, SSE, SSE2,3,4 e molti progressi nellassemblaggio rispetto al ultimi 35 anni. Oltre allaccesso più rapido per qualsiasi trasferimento di dati, manipolazione di bit, operazioni su stringhe, funzioni matematiche avanzate e, e, e …

Anche se in alcuni casi il codice x86 originale è un vantaggio: non puoi battere la rigidità del codice!

Modifica: (e un piccolo sproloquio, potresti ignorarlo)

Va ​​bene, controllo sempre il valore di frasi del genere. Ho appena compilato x86\_64 vs codice legacy 8086. 53 byte per x88\_64 contro 74 byte sul codice legacy 8086 con un piccolo programma. Bene … Se lo mantieni a 8/16 bit, potrebbe essere vero. Ma non con i software moderni, i programmi C ei compilatori. Quindi, niente lacrime riguardo al fatto che i vecchi tempi delleredità sono andati. Siamo onesti: erano una merda. Lunica cosa buona era che allora ero giovane e brillante. Ma questo aveva altri svantaggi.

Il punto è: i nostri processori moderni sono davvero fantastici. Ora abbiamo quello che avevamo solo nei nostri sogni negli anni 80. Finalmente abbiamo dischi rigidi abbastanza grandi che non ci interessa un byte o due. Abbiamo memoria sufficiente, se non guidiamo Windows o altri divoratori di risorse. Abbiamo lelaborazione vettoriale sulla nostra CPU e il calcolo parallelo totale sulle nostre GPU. Abbiamo multicores, FPU matematiche, registri specializzati come in MMX, SSE, SSEx, abbiamo FMA3 e FMA4 (beh, se hai un processore AMD almeno altrimenti devi aspettare molto tempo per metterti le mani su quello), noi ottenuto codici operativi di assemblaggio altamente sofisticati che fanno tutte le cose interessanti nel microcodice o anche nellhardware per noi, molto spesso, solo fatto in un ciclo, abbiamo una memoria cache che è più grande di qualsiasi cosa avremmo osato sognare negli anni 80 .

E la cosa “in arrivo” negli anni 80 fu il CD e lidea di immagazzinare gigabyte strabilianti su un piatto dargento a buon mercato era semplicemente inimmaginabile. E abbiamo telefoni con computer che sono in grado di simulare i più grandi computer mainframe dell85 per un fattore 10000 della loro velocità o qualcosa del genere.

Ora abbiamo tutte le cose interessanti!

Ma cosa ne facciamo? Twitter 144 caratteri. Nessuno conosce più le meraviglie dei codici operativi di assemblaggio dei nostri nuovissimi processori. Facciamo semplicemente clic su quel fottuto spam e guidiamo i sistemi Windows, che sono stati classificati come “spariti presto”, “di merda”, “cosa ne fai con quella merda” anche nel 1985, quando ho iniziato a studiare.

Sono davvero migliorato con Windows. È ancora una schifezza piena di bug e malware, che sta monopolizzando le meraviglie dellhardware del nostro computer, che è così sorprendente che, se installi un sistema operativo migliore per i nostri tempi, ti farà saltare la mente. Soprattutto come sviluppatore.

Lo sviluppo dei nostri processori sta rallentando con solo due concorrenti rimasti sul mercato e dovrebbe essere il momento di dare libero sfogo a ciò che già abbiamo: spegni quella merda a 32 bit, inizia a ottimizzare il nostro codice della libreria in assembly dove possiamo. Facoltativo, con sempre un fallback alla pura “C”.

E che cazzo è Twitter? È uno scherzo, non è vero? 144 caratteri ?! Non è serio, o? Hanno notato che tipo di hardware abbiamo? Nessuna parola contro Twitter, bel servizio, ma sai cosa intendo. Stanno pensando così in piccolo e falliscono anche allora.

Risposta

Odierai questa risposta.

Pronto?

Dipende.

Un puntatore è la dimensione di un indirizzo sulla macchina per la quale viene compilato il programma C.

  • Sul microprocessore Z80, popolare negli anni 80, un puntatore è di 16 bit.
  • Nell8086 originale, un puntatore potrebbe essere di 16, 20 o 32 bit, anche se lo spazio degli indirizzi era largo solo 20 bit. Dovevi dare al compilatore C un argomento della riga di comando che dicesse quanto dovrebbe essere largo un puntatore. È stato un incubo.Cerca “ modello di memoria ” su wikipedia per unintroduzione lunga e orribile.
  • Sul microprocessore 68000, i puntatori erano a 32 bit.
  • Sul modello x86 utilizzato per processori Intel fino a circa 5 anni fa, e ancora utilizzabile, un puntatore era a 32 bit, consentendogli di indirizzare circa 4 GB. Questa limitazione porta alla creazione di indirizzi a 64 bit.
  • Sul modello x64 utilizzato per i processori Intel delle ultime generazioni, un puntatore è a 64 bit.

Non è possibile supponiamo che un puntatore abbia la stessa dimensione di un int o la stessa dimensione di un long. La costante intera 0 può essere convertita in un puntatore, ma altre costanti intere potrebbero non essere convertibili. Quando si converte 0 in un puntatore, non vi è alcuna garanzia che i bit contenuti nel puntatore saranno tutti zeri, sebbene questo sia tipico. Potrebbe essere qualsiasi cosa. 0 è convertito in un puntatore che punta a un indirizzo non valido. È possibile aggiungere un numero intero a un puntatore, ottenendo un puntatore o sottrarre un numero intero da un puntatore, ottenendo un puntatore. Qualsiasi altra cosa ha un effetto indefinito.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *