28 Stimmen

Von int, char, float und bool, welches ist am kleinsten?

Das folgende stammt aus einem "Machen Sie zu Hause" Programmierungstest, der Teil des Bewerbungsprozesses für einen MSc in Game Development an einer britischen Universität ist:

C++ Grundlagen

Wenn ein Programm vier Variablen deklariert hätte, eine vom Typ int, eine vom Typ float, eine vom Typ char und eine vom Typ bool, welche Variable würde am wenigsten Speicherplatz im Speicher beanspruchen?

  1. int
  2. char
  3. float
  4. bool

Laut den Anweisungen gibt es nur eine wahre Aussage. Allerdings besagt mein C++-Buch (C++-Taschenreferenz, O'Reilly): "Die typische Größe eines bool beträgt ein Byte" und "Die Größe eines char beträgt ein Byte. Die Größe eines Bytes ist technisch gesehen implementierungsdefiniert, beträgt aber selten etwas anderes als acht Bits."

Verstehe ich hier etwas falsch? Welche Antwort würdest du geben und warum?

34voto

Kerrek SB Punkte 445528

Kein Typ nimmt weniger als char ein, weil nach Definition sizeof(char) == 1 ist. Es ist jedoch durchaus möglich, dass alle Typen die gleiche Menge an Speicherplatz einnehmen.

(Die Darstellung jedes Typs mit 16 Bits (mit einem entsprechend ungewöhnlichen Gleitkommazahlenformat) würde ausreichen, um die Standardwertebereichsanforderungen zu erfüllen; echte Hardware, bei der jeder Typ 32 Bits hat, existiert.)

12voto

Tamara Wijsman Punkte 12072

Wenn ein Programm vier Variablen deklariert hätte, eine vom Typ int, eine vom Typ float, eine vom Typ char und eine vom Typ bool, welche Variable würde den geringsten Speicherplatz im Speicher einnehmen?

Das eigentliche Problem bei der von Ihnen gestellten Frage liegt in diesen Worten:

Speicherplatz im Speicher einnehmen

Wenn man eine Interpretation annehmen muss, dann würden Sie in den meisten Fällen davon ausgehen, dass eine der aktuellen populären Compiler verwendet wird, in welchem Fall die Antwort 2 und 4 beide den geringsten Speicherplatz im Speicher einnehmen würden. Einfach weil die aktuellen populären Compiler das char und das bool jeweils einen einzigen Byte im Speicher einnehmen lassen...

Wie in den Kommentaren erläutert, ist sizeof() vom Typ size_t, welches Integral ist.

Da sizeof(char) == 1 gemäß dem Standard immer wahr ist und der Wert integral ist, kann kein anderes sizeof(T) kleiner als 1 sein. Aber jedes andere T als char kann größer als 1 sein, abhängig von der Implementierung. Da man nicht davon ausgehen kann, dass sizeof(char) == sizeof(bool) immer gilt, kann man zumindest davon ausgehen, dass sizeof(char) <= sizeof(bool) gilt.

Was sizeof(char) zur richtigeren Antwort macht, da es am wenigsten ist...

5voto

Ben Lee Punkte 51313

Die Antwort ist char. Keine andere Antwort ist korrekt.

(Obwohl ich zustimme, dass die Frage besser formuliert hätte sein sollen).

Der C++03-Standard $5.3.3/1 besagt:

sizeof(char), sizeof(signed char) und sizeof(unsigned char) sind 1; das Ergebnis von sizeof angewendet auf jeden anderen Grundtyp (3.9.1) ist implementationsabhängig. [Anmerkung: insbesondere sind sizeof(bool) und sizeof(wchar_t) implementationsabhängig.])

(Habe diese Informationen von einer anderen Frage gefunden: Warum ist die Größe von bool nicht vom Standard selbst definiert?).

Angesichts der Mindestgröße von 1 (sizeof muss ganzzahlige Werte zurückgeben) bedeutet dies, dass Folgendes in jeder Implementierung, die den Standards folgt, wahr sein wird:

sizeof(char) == 1
sizeof(bool) >= 1
sizeof(int) >= 1
sizeof(float) >= 1

Die Frage war schlecht formuliert und hätte wahrscheinlich klarer gestellt werden sollen als "...welche Variable würde notwendigerweise im Speicher nicht mehr Platz einnehmen als jede andere (in jeder gut funktionierenden Standardimplementierung von C++)?"

2voto

Carl Norum Punkte 210051

Die Sprache legt keine Beziehungen zwischen den Typgrößen fest, die eine korrekte Antwort auf diese Frage sicherstellen, wie sie gestellt wurde. Sie könnten beispielsweise alle 32-Bit-Typen sein.

2voto

Roland Bouman Punkte 29957

Ich denke, die korrekte Antwort sollte 2 sein. Nach Definition ist ein char die kleinste adressierbare Einheit.

Siehe auch: Warum haben ein char und ein bool die gleiche Größe in c++?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X