webentwicklung-frage-antwort-db.com.de

Hängt die Größe eines Int von Compiler und/oder Prozessor ab?

Hängt die Größe einer Ganzzahl von Compiler, Betriebssystem und Prozessor ab?

65
Vijay

Die Antwort auf diese Frage hängt davon ab, wie weit wir von praktischen Überlegungen entfernt sind.

Letztendlich hängt theoretisch alles in C und C++ vom Compiler und nur vom Compiler ab. Hardware/OS spielt überhaupt keine Rolle. Dem Compiler steht es frei, eine Hardwareabstraktionsschicht von any width zu implementieren und absolut alles zu emulieren. Nichts hindert eine C- oder C++ - Implementierung daran, den Typ int beliebiger Größe und Darstellung zu implementieren, sofern er groß genug ist, um die im Sprachstandard festgelegten Mindestanforderungen zu erfüllen. Praktische Beispiele für ein solches Abstraktionsniveau sind leicht verfügbar, z. Programmiersprachen, die auf der "Virtual Machine" -Plattform basieren, wie Java.

C und C++ sollen jedoch hoch effizient Sprachen sein. Um maximale Effizienz zu erzielen, muss eine C- oder C++ - Implementierung bestimmte Überlegungen berücksichtigen, die von der zugrunde liegenden Hardware abgeleitet werden. Aus diesem Grund ist es sehr sinnvoll sicherzustellen, dass jeder Basistyp auf einer Darstellung basiert, die direkt (oder fast direkt) von der Hardware unterstützt wird. In diesem Sinne hängt die Größe der Basistypen von der Hardware ab.

Mit anderen Worten, es steht einer bestimmten C- oder C++ - Implementierung für eine 64-Bit-Hardware/Betriebssystem-Plattform absolut frei, int als 71-Bit-1-Komplement-Integraltyp mit Vorzeichen zu implementieren, der 128 Bit Speicher belegt 57 Bits als Füllbits, die immer benötigt werden, um das Geburtsdatum der Freundin des Compilerautors zu speichern. Diese Implementierung hat sogar einen gewissen praktischen Wert: Sie kann verwendet werden, um Laufzeitprüfungen der Portabilität von C/C++ - Programmen durchzuführen. Aber hier würde der praktische Nutzen dieser Implementierung enden. Erwarten Sie nicht, so etwas in einem "normalen" C/C++ - Compiler zu sehen.

117
AnT

Ja, dies hängt von beiden Prozessoren (insbesondere ISA, Befehlssatzarchitektur, z. B. x86 und x86-64) und von Compilern einschließlich Programmiermodell ab. In 16-Bit-Computern betrug die Größe von (int) beispielsweise 2 Byte. 32-Bit-Maschinen haben 4 Bytes für int. Es wurde angenommen, dass int die native Größe eines Prozessors war, d. H. Die Größe des Registers. 32-Bit-Computer waren jedoch so beliebt, und für das 32-Bit-Programmiermodell wurde eine große Anzahl von Software geschrieben. Es wäre also sehr verwirrend, wenn ein 64-Bit-Computer 8 Bytes für int hätte. Sowohl Linux als auch Windows bleiben 4 Byte für int. Sie unterscheiden sich jedoch in der Größe von long.

Schauen Sie sich bitte das 64-Bit-Programmiermodell an, wie LP64 für die meisten * nix und LLP64 für Windows:

Solche Unterschiede sind eigentlich ziemlich peinlich, wenn Sie Code schreiben, der sowohl unter Windows als auch unter Linux funktionieren soll. Also verwende ich immer int32_t oder int64_t anstatt long über stdint.h .

32
minjang

Ja es würde. Bedeuteten sie "von was es abhängt: vom Compiler oder vom Prozessor"? In diesem Fall lautet die Antwort im Wesentlichen "beide". Normalerweise ist int nicht größer als ein Prozessorregister (es sei denn, es ist kleiner als 16 Bit), es könnte jedoch kleiner sein (z. B. ein 32-Bit-Compiler, der auf einem 64-Bit-Prozessor ausgeführt wird). Im Allgemeinen benötigen Sie jedoch einen 64-Bit-Prozessor, um Code mit einem 64-Bit-Int auszuführen.

7
Jerry Coffin

Basierend auf aktuellen Forschungsergebnissen habe ich mich mit Firmware-Interviews befasst:

Die bedeutendste Auswirkung der Prozessor-Bit-Architektur, dh 8-Bit-, 16-Bit-, 32-Bit- und 64-Bit-Architektur, ist, wie Sie jedes Informationsbyte am effizientesten speichern müssen, um die Variablen mit der minimalen Anzahl von Zyklen optimal berechnen zu können.

Die Bitgröße Ihres Prozessors gibt an, welche natürliche Länge die CPU in einem Zyklus verarbeiten kann. Ein 32-Bit-Computer benötigt zwei Zyklen, um ein 64-Bit-Double zu verarbeiten, wenn er ordnungsgemäß im Speicher ausgerichtet ist. Die meisten PCs waren und sind immer noch 32-Bit, daher der wahrscheinlichste Grund für die typische Affinität des C-Compilers für 32-Bit-Ganzzahlen mit Optionen für größere Fließkommazahlen und lange Long-Werte.

Natürlich können Sie größere Variablengrößen berechnen, so dass die Bit-Architektur der CPU bestimmt, wie große und kleinere Variablen gespeichert werden müssen, um die bestmögliche Verarbeitungseffizienz zu erzielen. Dies ist jedoch kein begrenzender Faktor bei der Definition von Bytegrößen Für Ints oder Zeichen ist dies ein Teil von Compilern und das, was durch Konventionen oder Standards vorgegeben wird.

Ich fand diese Seite sehr hilfreich, http://www.geeksforgeeks.org/archives/9705 , um zu erklären, wie sich die natürliche Wortlänge der CPU auswirkt, wie große und kleinere Variablentypen gespeichert und verarbeitet werden sollen, insbesondere mit in Bezug auf das Packen von Bits in structs. Sie müssen sehr genau wissen, wie Sie sich für die Zuweisung von Variablen entschieden haben, da größere Variablen im Arbeitsspeicher ausgerichtet werden müssen, damit sie die kleinste Anzahl von Zyklen benötigen, wenn sie durch die Wortlänge der CPU geteilt werden. Dies fügt eine Menge potenziell unnötiger Puffer-/Leerräume zu Dingen wie structs hinzu, wenn Sie die Zuweisung Ihrer Variablen schlecht ordnen. 

6
SCW

Die einfache und korrekte Antwort ist, dass es vom Compiler abhängt. Das bedeutet nicht, dass Architektur irrelevant ist, aber der Compiler kümmert sich darum, nicht um Ihre Anwendung. Man könnte genauer sagen, es hängt von der (Ziel-) Architektur des Compilers ab, zum Beispiel, ob es 32 Bit oder 64 Bit ist.

Stellen Sie sich vor, Sie haben eine Windows-Anwendung, die eine Datei erstellt, in der sie eine int sowie andere Elemente schreibt und zurückliest. Was passiert, wenn Sie dies sowohl für 32-Bit- als auch für 64-Bit-Fenster ausführen? Was passiert, wenn Sie die auf einem 32-Bit-System erstellte Datei kopieren und in einem 64-Bit-System öffnen?

Sie denken vielleicht, dass die Größe von int in jeder Datei unterschiedlich ist, aber nein, sie sind gleich und dies ist der Kern der Frage. Sie wählen die Einstellungen im Compiler für die 32-Bit- oder 64-Bit-Architektur aus, und das bestimmt alles.

2
zar

die Größe des Datentyps hängt im Wesentlichen von der Art des Compilers ab. Compiler werden auf der Grundlage der Prozessorarchitektur entworfen, so dass der externe Datentyp als vom Compiler abhängig betrachtet werden kann. Für die Ex-Größe der Ganzzahl sind 2 Byte in einem 16-Bit-Tc-Compiler, aber 4 Byte erforderlich im gcc-Compiler, obwohl sie in demselben Prozessor ausgeführt werden 

0
mukesh

http://www.agner.org/optimize/calling_conventions.pdf

"3 Datendarstellung" enthält einen guten Überblick darüber, was Compiler mit Integraltypen tun.

0
bruziuz

Die Größe des Int ist gleich der Wortlänge, die von der zugrunde liegenden ISA abhängt. Prozessor ist nur die Hardware-Implementierung von ISA und der Compiler ist nur die softwareseitige Implementierung von ISA. Alles dreht sich um die zugrunde liegende ISA. Am beliebtesten ISA ist in diesen Tagen Intels IA-32. Es hat eine Wortlänge von 32 Bit oder 4 Byte. 4 Bytes könnten die maximale Größe von 'int' (einfach nur int, nicht kurz oder lang) sein. basierend auf IA-32, könnte verwenden. 

0
KawaiKx

Datentypen Die Größe hängt vom Prozessor ab, da der Compiler den Zugriff auf die CPU im nächsten Byte erleichtern soll. Zum Beispiel: Wenn der Prozessor 32 Bit hat, wählt der Compiler die int-Größe möglicherweise nicht als 2 Byte [wobei er 4 Byte wählen soll], da der Zugriff auf weitere 2 Byte dieses Int (4 Byte) zusätzlichen CPU-Zyklus erfordert, der unnötig ist. Wenn der Compiler int als 4 Byte wählt, kann die CPU in einem Schritt auf volle 4 Byte zugreifen, was Ihre Anwendung beschleunigt.

Vielen Dank

0
mahesh