Warum sind die Typen immer eine bestimmte Größe haben, unabhängig von Ihrem Wert?

Implementierungen unterscheiden, die die tatsächliche Größe der Arten, aber auf den meisten, Typen wie unsigned int und float immer 4 Byte. Aber warum hat der Typ immer besetzt bestimmte Menge an Speicher, egal, der Wert? Wenn ich zum Beispiel erstellt der folgende ganze Zahl mit dem Wert 255

int myInt = 255;

Dann myInt belegen würde 4 bytes mit meinem compiler. Allerdings ist der tatsächliche Wert, 255 dargestellt werden kann, mit nur 1 byte, also warum sollte myInt nicht nur belegen 1 byte an Speicher? Oder die allgemeinere Art zu Fragen: Warum macht ein Typ nur eine Größe zugeordnet, wenn der Platz benötigt, um den Wert möglicherweise kleiner als die Größe?

  • 1) "Jedoch den tatsächlichen Wert, 256 dargestellt werden kann, mit nur 1 byte" Falsch, der größte unsinged Wert, der dargestellt werden kann mit 1-byte 255. 2) Betrachten Sie den overhead der Berechnung der optimalen Speichergröße und verkleinern/erweitern der Speicher-Bereich, der eine variable, so verändert sich der Wert.
  • Gut, wenn die Zeit kommt, Lesen Sie den Wert aus dem Speicher, wie Sie vorschlagen, die Maschine bestimmt, wie viele bytes zu Lesen? Wie wird die Maschine wissen, wo Sie aufhören zu Lesen das Wert? Dies erfordert zusätzliche Einrichtungen. Und im Allgemeinen Fall wird die Speicher-und performance-overhead für diese zusätzlichen Einrichtungen wird viel höher sein, als im Falle der einfach mit festen 4 bytes für unsigned int Wert.
  • Warum macht ein Typ nur eine Größe zugeordnet, wenn der Platz benötigt, um den Wert möglicherweise kleiner als die Größe? Weil es vielleicht nicht immer kleiner werden.
  • Ich mag diese Frage. Obwohl es scheinen mag einfach zu beantworten, ich denke, dass die eine präzise Erklärung erfordert eine gute understandning, wie computer und computer-Architekturen, die wirklich funktionieren. Die meisten Leute werden wahrscheinlich nur nehmen es für selbstverständlich, ohne dass Sie eine umfassende Erklärung für Sie.
  • FYI - Auf Ubuntu 17.10, sizeof (std::string) Berichte 32 bytes automatische Speicher, unabhängig davon, wie viele chars sind es. (Alle Daten, die chars sind in dynamischer Speicher!!!) Aber dies ist eine Implementierung detail. Ähnliche Angaben existieren für std::vector und viele andere Behälter.
  • 1) Ahh ja, ich meinte, dass 1 byte kann 256 verschiedene Werte darstellen. Lassen Sie mich Bearbeiten Sie die Frage, um genauer zu sein 2) ich sehe, Sie könnten aber auch etwas Speicher sparen, so die Nachteile und Vorteile von dynamischer Größe, können gleichwertig sein, die vor-und Nachteile von statischen Größen. Also, die Art der Lagerung abhängig wäre von der situation in denen der eine wichtiger als der andere.
  • 1) die Lagerung ist nur die eine Seite der Gleichung. Berechnung der Geschwindigkeit ist eine andere. In einem typischen Fall -, Rechen-Geschwindigkeit wichtiger ist als die Speicherkapazität. Also, warum sollte man dafür bezahlen, was er nicht braucht? 2) Die Arten der char, short usw. existieren aus einem Grund: wenn Sie wissen, dass die zahlen, die Sie arbeiten auf klein-genug zahlen, können Sie mit kleineren Datentyp. 3) Lesen Sie weitere Kommentare/Antworten. In einem typischen Fall: Es ist einfach nicht der Mühe Wert.
  • Betrachten Sie, was passieren, wenn Sie 1, um den Wert der Variablen, so dass es 256, also würde es brauchen, um zu erweitern. Wo kommt es zu erweitern? Bewegen Sie den rest der Erinnerung Platz zu machen? Nicht die variable selbst bewegen? Wenn ja, wo bewegt es sich und wie finden Sie die Hinweise, die Sie brauchen, um zu aktualisieren?
  • Typen, die im Allgemeinen nicht Konstante Größe. int, float, etc. haben. viele andere haben Konstante Größe in c++, im Gegensatz zu einigen anderen Sprachen, aus performance-Gründen. Andere Arten haben variable Größe, auch in c++, weil Sie es brauchen, z.B.: std::vector
  • Nein, Sie sind falsch. std::vector<X> hat immer die gleiche Größe, d.h. sizeof(std::vector<X>) ist eine Compilezeit-Konstante.
  • Ich vermisse die Erklärung: es ist gespeichert als 4 bytes, weil "int" hat den expliziten Auftrag, dies zu tun.
  • Protokoll-Puffer ist Varints sind ein Beispiel einer Implementierung eines variable-Länge-Menge, wo "Kleinere zahlen nehmen mit einer kleineren Anzahl von bytes.", wie du es beschreibst.
  • Wenn Sie kaufen eine acht-stelliger Rechner, es wird ein drei-stelliger Rechner, wenn Sie geben Sie den Wert 255? Ich bezweifle es.
  • Ich bin nicht einverstanden. Offensichtlich sizeof(std::vector<X>) ist eine compile-Zeit-Konstante, aber nur, weil sizeof ist nicht genau zu sagen, Sie die Menge des Speichers, die der Typ belegt. Das ist mehr wie sizeof(vec) + vec.capacity()*(sizeof(vec.front())) + vec.capacity() ? dynamic_memory_overhead : 0
  • Sie sind frei, anderer Meinung als Sie, aber in C++ Begriffe, die Größe des Typs ist Wert, der zurückgegeben wird, durch sizeof Betreiber. Es ist eine definition von Standard.
  • 255 und die Sie verwenden möchten 2 nibbles für Sie. OK, das kann ich sehen. Wie viele Sie verwenden möchten, für 9? Wie viele für null?
  • Daten-Typen und Ihre Zuordnung zu Speicher ist sehr relevant zu Programmieren; es ist kaum ein Thema der "Allgemeine Computer-hardware und-software." Das schließen Grund ist, für die Menschen zu Fragen, wie die Arbeit Ihre Tabellenkalkulation, zum Beispiel. Die Abstimmung erneut zu öffnen.
  • Ich Stimme mit @WayneConrad - ich sehe nicht, wie die engen Grund gilt auch hier. Es scheint wie eine ganz angemessene Frage für mich.
  • Nur um zu unterdrücken jede mögliche streiten... beide SergeyA und Martin Bonner korrekt sind. std:vector<T> kapselt eine dynamisch zugewiesene Arrays, wie zum Beispiel erzeugt durch new T[N], in der Regel durch die Speicherung ein handle auf das besagte array. std::vector's Größe ist somit konstant, und genau gemessen sizeof. Jedoch, da die eigentliche Datenspeicherung verwaltet vector gar nicht in die vector selbst, es wird nicht reflektiert, indem das Ergebnis sizeof.
  • Selbst wenn man die Daten speichern in 8-bits, die auf den meisten Systemen, Sie müssen nicht die option zum Lesen von Daten auf 8 bits zu einer Zeit, als Prozessoren haben in der Regel eine Feste Breite Datenbus (z.B. 32 bit). Sie werden am Ende Lesung 32 bits aus dem Speicher und einfach "ignorieren" 24-bits mit Ihrer Regelung, dass die ganze "Optimierung" sinnlos.

InformationsquelleAutor Nichlas Uden | 2018-06-12
Schreibe einen Kommentar