Die Größe von Primitiven Datentypen
Was genau hat die Größe eines primitiven Datentyps wie int
ab?
- Compiler
- Prozessor
- Entwicklungsumgebung
Oder ist es eine Kombination dieser oder anderer Faktoren?
Eine Erklärung auf der Grund der gleiche sein wird, wirklich hilfreich.
EDIT: Sorry für die Verwirrung..ich wollte Fragen Primitiven Datentypen wie " int "und nicht über "PODs", ich verstehe PODs können include-Struktur, und Struktur ist es ein ganz anderes Spiel mit Polsterung kommt in dem Bild.
Ich habe korrigiert die Q der edit-Hinweis: hier soll gewährleisten, dass alle Antworten in Bezug auf POD sehen nicht irrelevant.
- Meinst du primitiv (oder built-in) Typen, oder tatsächlich POD-Typen (structs, unions)?
- Eine wichtige Frage.
- mögliche Duplikate von C++ : die Größe von int, long, etc...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es gibt zwei Teile zu dieser Frage:
Welche Größen primitive Typen sind erlaubt werden.
Diese angegeben wird die C-und C++ - standards: haben die Typen erlaubt minimale Wertebereiche müssen Sie haben, die implizit legt eine untere Grenze für Ihre Größe in bits (z.B.
long
muss mindestens 32 bit, um die Einhaltung der standard).Die standards spezifizieren nicht die Größe in bytes, weil die definition der byte - ist bis zu der Umsetzung, z.B.
char
byte, aber byte-Größe (CHAR_BIT
makro) können 16 bit.Den tatsächlichen Größe, durch die Implementierung definiert.
Diese wie auch die anderen Antworten haben schon darauf hingewiesen, ist abhängig von der Implementierung: der compiler. Und der compiler-Implementierung, die wiederum stark beeinflusst von der Ziel-Architektur. So ist es plausibel, zwei-Compilern auf dem gleichen OS und Architektur, aber unterschiedlicher Größe
int
. Die einzige Annahme, die man machen kann, ist, das man bereits von der Norm (gegeben, dass der compiler implementiert).Es kann auch weitere ABI-Anforderungen (z.B. Feste Größe von enums).
char
, denn das ist effizient mit dem Prozessor.CHAR_BIT
werden kann, >= 8, so ist die tatsächliche Größe derchar
in bits größer als 8.Zuerst, es hängt davon ab, Compiler. Compiler in Kurven in der Regel abhängig von der Architektur, Prozessor, Entwicklungsumgebung, etc, weil es berücksichtigt. So können Sie sagen, es ist eine Kombination von allen. Aber ich würde NICHT sagen, dass. Ich würde sagen, Compiler, da auf der gleichen Maschine können Sie verschiedene Größen der POD und built-in Typen, wenn Sie verschiedene Compiler. Beachten Sie auch, dass Sie Ihre source-code-Eingabe für den compiler, damit es der compiler macht letzten Entscheidung der Größen von POD-und built-in-Typen. Es ist jedoch auch wahr, dass diese Entscheidung wird beeinflusst durch die zugrunde liegende Architektur des Zielrechners. Nachdem alle, die wirkliche nützlich compiler hat emittieren effiziente code, schließlich läuft auf der Maschine, die Sie Ziel.
Compiler bietet
options
zu. Einige von Ihnen können effektstärken auch!EDIT: Was Normen sagen,
Größe
char
,signed char
undunsigned char
ist definiert durch C++ - Standard selbst! Größen von allen anderen Typen sind definiert durch den compiler.C++03-Standard $5.3.3/1 sagt,
C99-Standard ($6.5.3.4) auch selbst definiert die Größe der
char
,signed char
undunsigned char
1, aber Blätter die Größe von anderen Typen definiert werden, die vom compiler!EDIT:
Fand ich diese C++ - FAQ Kapitel wirklich gut. Das gesamte Kapitel. Es ist sehr kleines Kapitel, obwohl. 🙂
http://www.parashift.com/c++-faq-lite/intrinsic-types.html
Lesen Sie auch die Kommentare unten, es gibt einige gute Argumente!
sizeof(int)
zu 15 und seine Ausrichtung zu 5. Es würde langsam sein, aber der compiler konnte einfach code generieren, damit es funktioniert.char
mit einer Größe von 1 (Messung definiert durch compiler).Wenn Sie Fragen über die Größe eines primitive Typ wie
int
ich würde sagen, es hängt von der Faktor, den Sie zitiert.Compiler/Umgebung paar (wo Umwelt bedeutet oft, OS) ist sicherlich ein Teil davon, da der compiler kann die Zuordnung der verschiedenen "vernünftigen" Größen auf dem builtin-Typen auf verschiedene Weise aus verschiedenen Gründen: zum Beispiel Compiler, die auf Windows-x86_64 wird in der Regel eine 32-bit -
long
- und eine 64-bit -long long
zu vermeiden, brechen code gedacht für Reine x86; x86_64-Linux, statt,long
ist in der Regel 64 bit, weil es eine "Natürliche" Auswahl und apps entwickelt, die für Linux sind in der Regel mehr Architektur-neutral (denn Linux läuft auf eine viel größere Vielfalt von Architekturen).Den Prozessor sicherlich Fragen bei der Entscheidung:
int
sollte die "Natürliche Größe" des Prozessors, in der Regel die Größe von die general-purpose-Registern des Prozessors. Dies bedeutet, dass es die geben, die die Arbeit schneller auf die aktuelle Architektur.long
stattdessen wird oft als eine Art, die trades die performance für eine erweiterte Produktpalette (das ist selten wahr, die auf regulären PCs, aber auf Mikrocontrollern ist es normal).Wenn in sondern Sie sprechen auch über
struct
s & co. (welches, wenn dabei einige Regeln, sindPOD
), wieder der compiler und der Prozessor Einfluss auf Ihre Größe, da Sie aus der builtin-Typen und der passenden Polsterung, gewählt durch den compiler zu erreichen die beste Leistung auf dem Ziel-Architektur.Als ich kommentierte unter @Nawaz Antwort, es technisch ist, hängt ausschließlich von den compiler.
Ist der compiler nur die Aufgabe, mit der Einnahme von gültigen C++ - code, und die Ausgabe Gültiger Maschinen-code (oder was auch immer Sprache, die Sie Zielen).
Also ein C++ - compiler könnte sich entscheiden, um eine
int
haben eine Größe von 15, und neu ausgerichtet werden auf 5-byte-Grenzen, und es könnte entscheiden, legen Sie beliebige Polsterung zwischen den Variablen in einem POD. Nichts in der standard verbietet dies, und es konnte erzeugen noch ein funktionierenden code.Es würde nur viel langsamer.
So, in der Praxis, Compiler nehmen einige Hinweise aus dem system Sie laufen, haben zwei Möglichkeiten:
- die CPU hat bestimmte Vorlieben: zum Beispiel, kann es ein 32-bit breites Register, so dass eine
int
32 bit breit wäre eine gute Idee, und es erfordert in der Regel die Variablen werden natürlich ausgerichtet (eine 4 byte große variable muss ausgerichtet werden auf eine Adresse teilbar durch 4, zum Beispiel), so ein sinnvoll compiler Hinsicht diese Einstellungen denn es führt zu schnelleren code.- das OS vielleicht etwas Einfluss, zu, in, dass, wenn es verwendet ein anderes ABI als der compiler, so dass system-calls wird unnötig schwierig.
Aber das sind nur praktische überlegungen, um das Leben ein bisschen einfacher für die Programmierer oder schnelleren code zu erzeugen. Sie sind nicht erforderlich.
Dem compiler hat das Letzte Wort, und es kann wählen Sie vollständig ignorieren sowohl die CPU und das OS. Solange es erzeugt einen ausführbaren arbeiten mit der Semantik angegeben, die in der C++ - standard.
Hängt es von der Implementierung (compiler).
Implementation-defined behavior
bedeutet nicht spezifiziert Verhalten, wo jede Implementierung dokumentiert, wie die Auswahl getroffen wird.Einen
struct
auch POD, in dem Fall kann man ausdrücklich control potential Polsterung zwischen Mitgliedern mit#pragma pack
auf manchen Compilern.