Beste Antwort
> 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
Die Zeigergröße hängt nur von dem Modell ab, unter dem Sie Ihren Code kompilieren. Nicht auf dem Betriebssystem. Ich habe also ein 64-Bit-Linux, aber wenn ich gcc zwinge, 32-Bit-Code zu kompilieren, erhalte ich 32-Bit-ELF- und i386-Code mit nur 4 Byte Zeigergröße.
Wenn Sie unter Windows 4 Byte erhalten, bedeutet dies, dass Sie kompilieren noch 32bit und Sie sollten den Schalter finden, um das volle Potenzial Ihrer Maschine auszuschöpfen. Entfessle den Kraken!
Ich habe gerade gemessen, dass gestern zwischen der Leistung von 32-Bit-i386-Code und x86\_64 bdver2 (Piledriver, Haswell und höher) mehr als Faktor 5 für die Geschwindigkeitssteigerung liegen kann, nicht nur die Verwendung des größeres Speichermodell. Das ist meistens nicht so kritisch, 4 GB Speicher reichen für die meisten Anwendungen aus.
Aber mit nur 32-Bit-Code verlieren Sie die Fähigkeiten von MMX, SSE, SSE2,3,4 und viele Fortschritte bei der Montage im Laufe der Zeit letzten 35 Jahre. Ebenso wie der schnellere Zugriff auf Datenübertragung, Bitmanipulation, Zeichenfolgenoperationen, erweiterte mathematische Funktionen und, und, und,
In einigen Fällen ist der ursprüngliche x86-Code von Vorteil: Sie können nicht Überwinde die Enge des Codes!
Bearbeiten: (und ein kleiner Scherz, den du vielleicht ignorierst)
Okay, ich überprüfe immer den Wert solcher Sätze. Gerade kompilierter x86\_64 vs 8086 Legacy Code. 53 Bytes für x88\_64 vs 74 Bytes für 8086 Legacy-Code mit einem kleinen Programm. Nun … Wenn Sie es bei 8/16 Bit halten, könnte dies wahr sein. Aber nicht mit moderner Software und C-Programmen und Compilern. Also keine Tränen darüber, dass die alten Legacy-Zeiten vorbei sind. Seien wir ehrlich: Sie waren Scheiße. Das einzig gute war, dass ich damals jung funkelte. Das hatte aber auch andere Nachteile.
Punkt ist: Unsere modernen Prozessoren sind wirklich cool. Wir haben jetzt das, was wir in den 80ern nur in unseren Träumen hatten. Wir haben endlich Festplatten, die groß genug sind, dass uns ein oder zwei Bytes egal sind. Wir haben genügend Speicher, wenn wir Windows oder andere Ressourcenfresser nicht fahren. Wir haben Vektorverarbeitung auf unserer CPU und Total Parallel Computing auf unseren GPUs. Wir haben Multicores, mathematische FPUs, spezialisierte Register wie in MMX, SSE, SSEx, wir haben FMA3 und FMA4 (wenn Sie zumindest einen AMD-Prozessor haben, müssen Sie lange warten, um das in die Hände zu bekommen), wir Wir haben hochentwickelte Assembler-Opcodes, die all die coolen Dinge in Mikrocode oder sogar in Hardware für uns erledigen, oftmals nur in einem Zyklus. Wir haben einen Cache-Speicher, der größer ist als alles, wovon wir in den 80ern zu träumen gewagt hätten .
Und das „Kommen“ in den 80ern war die CD, und die Idee, umwerfende Gigabyte auf einer billigen Silberplatte zu speichern, war einfach unvorstellbar. Und wir haben Telefone mit Computern, die in der Lage sind, die größten Großrechner von 85 um den Faktor 10000 ihrer Geschwindigkeit oder so etwas zu simulieren.
Jetzt haben wir all die coolen Sachen!
Aber was machen wir damit? Wir twittern 144 Zeichen. Niemand kennt mehr die Wunder der Montage-Opcodes unserer brandneuen Prozessoren. Wir klicken einfach auf verdammten Spam und fahren Windows-Systeme, die als „bald weg“, „beschissen“, „was machst du mit diesem Mist“ eingestuft wurden, sogar 1985, als ich anfing zu studieren.
Das tat es nicht Mit Windows ist es nicht wirklich besser geworden. Es ist immer noch fehlerhaft und Malware-Spam-Mist, der die Wunder unserer Computerhardware überschwemmt, die so erstaunlich sind, dass Sie, wenn Sie ein für unsere Zeit besser geeignetes Betriebssystem installieren, umhauen werden. Besonders als Entwickler.
Die Entwicklung unserer Prozessoren verlangsamt sich, da nur noch zwei Wettbewerber auf dem Markt sind. Es sollte an der Zeit sein, das, was wir bereits haben, wirklich zu entfesseln: Schalten Sie diese 32-Bit-Scheiße aus und optimieren Sie unsere Bibliothekscode in Assembly, wo wir können. Optional, mit immer einem Fallback auf reines „C“.
Und was zum Teufel ist Twitter? Das ist ein Witz, oder? 144 Zeichen?! Das ist nicht ernst oder? Haben sie bemerkt, welche Art von Hardware wir haben? Kein Wort gegen Twitter, netter Service, aber du weißt was ich meine. Sie denken so verdammt klein und scheitern selbst dann.
Antwort
Sie werden diese Antwort hassen.
Fertig?
Dies hängt davon ab.
Ein Zeiger ist die Größe einer Adresse auf dem Computer, für den das C-Programm kompiliert wird.
- Auf dem in den 1980er Jahren beliebten Z80-Mikroprozessor Ein Zeiger ist 16 Bit groß.
- Auf dem ursprünglichen 8086 kann ein Zeiger 16, 20 oder 32 Bit groß sein, obwohl der Adressraum nur 20 Bit breit war. Sie mussten dem C-Compiler ein Befehlszeilenargument geben, das angibt, wie breit ein Zeiger sein soll. Es war ein Albtraum.Eine lange und schreckliche Einführung finden Sie in Wikipedia unter „ Speichermodell „.
- Auf dem 68000-Mikroprozessor waren Zeiger 32-Bit.
- Auf dem x86-Modell, das bis vor ungefähr 5 Jahren für Intel-Prozessoren verwendet wurde und noch verwendet werden kann, war ein Zeiger 32 Bit groß, sodass er ungefähr 4 GB adressieren konnte. Diese Einschränkung führte zur Erstellung von 64-Bit-Adressen.
- Beim x64-Modell, das für Intel-Prozessoren der letzten Generationen verwendet wurde, ist ein Zeiger 64-Bit.
Dies ist nicht möglich Angenommen, ein Zeiger hat dieselbe Größe wie ein Int oder dieselbe Größe wie ein Long. Die Ganzzahlkonstante 0 kann in einen Zeiger konvertiert werden, andere Ganzzahlkonstanten sind jedoch möglicherweise nicht konvertierbar. Wenn Sie 0 in einen Zeiger konvertieren, gibt es keine Garantie dafür, dass die im Zeiger enthaltenen Bits alle Nullen sind, obwohl dies typisch ist. Es könnte überhaupt alles sein. 0 ist konvertiert in einen Zeiger, der auf keine gültige Adresse zeigt. Sie können einem Zeiger eine Ganzzahl hinzufügen, die einen Zeiger ergibt, oder eine Ganzzahl von einem Zeiger subtrahieren, was einen Zeiger ergibt. Alles andere hat eine undefinierte Wirkung.