Ist das hier normal? Laut meinem Lehrbuch steht folgendes:
1
Ein Zeiger ist eine Variable, die eine Adresse speichert. Wird der Operator sizeof
2
auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch des Feldes in Bytes.
3
Wird der Operator sizeof auf einen Zeiger angewendet, erhält man die Anzahl der Bytes, die zur Spei-
4
cherung einer Adresse auf der jeweils zu Grunde liegenden Rechnerarchitektur benötigt werden.Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit Rechnerarchitektur 8 Bytes.
Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat oder
eine 64-Bit CPU, die im 32-Bit-Modus läuft.
Viele 64-Bit CPUs (insb alle x86) können auch, so es das Betriebssystem
unterstützt (Win tut es), auch in einem 32-Bit Modus betrieben werden.
foobar schrieb:> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat> oder> eine 64-Bit CPU, die im 32-Bit-Modus läuft.
Stimmt nicht.
Es zeigt, dass der Compiler den Source Code für ein 32 bit System
compiliert. Welche CPU der Rechner auf dem compiliert wird hat oder
welche CPU das System später haben wird, auf dem das Programm läuft,
spielt hier keine Rolle.
Simon schrieb:> Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit> Rechnerarchitektur 8 Bytes.
ein 32Bit Programm kann nicht magisch 64Bit Speicher adressieren
Bobby X schrieb:> Welche CPU der Rechner auf dem compiliert wird hat oder> welche CPU das System später haben wird, auf dem das Programm läuft,> spielt hier keine Rolle.
Korrekt. Genauer gesagt, ersetzt der Compiler Ausdrücke der Form
"sizeof XY" beim Kompilieren mit einer Konstanten. In der Programmdatei
steht da also fest 4, 8, oder was auch immer. Sofern die CPU und OS
das Programm mit oder ohne Kompatibilitätsmodus ausführen können, ist
die Ausgabe also immer die selbe. Da ist keine dynamische Abfrage drin.
Simon schrieb:> Ist das hier normal? Laut meinem Lehrbuch steht folgendes:
Was ist das denn für ein Compiler, wo hast du den her? In Lehrbüchern
wird gerne mal antike Software genutzt, welche z.B. kein 64bit kennt.
Simon schrieb:> printf("Groesse von ptr = %d", sizeof(ptr));
Das ist übrigens falsch, es muss "%zu" sein und nicht "%d", denn
"sizeof" gibt den Typ "size_t" zurück, welcher (insb. eben bei
64bit-Systemen) größer als "int" sein kann, und "%d" erwartet "int". Für
size_t daher "%zu". Dein Lehrbuch scheint also nicht sehr gut zu sein.
Simon schrieb:> Wird der Operator sizeof> auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch> des Feldes in Bytes.
Das ist so nicht ganz korrekt, sizeof gibt dir den Speicherverbrauch des
Feldes als Vielfaches von char. Der C-Standard iso9899:1999 garantiert
dir das sizeof(char) == 1 ist. Er garantiert dir aber nicht das char
immer exakt ein Byte hat. (Auch wenn es in der Praxis wohl bei 95% aller
Systemen so ist) streng genommen könnten es auch 2 Bytes sein oder 5.
Simon schrieb:> Rechnerarchitektur benötigt werden.Auf einer 32-Bit Rechnerarchitektur> 4, auf einer 64-Bit Rechnerarchitektur 8 Bytes.
Hast du das Programm einmal für 32 Bit kompiliert & einmal für 64 Bit.
Die meisten modernen 64 Bit Maschinen können auch 32 Bit Programme
ausführen und weil sizeof(ptr) beim Kompilieren bekannt ist, wird der
Compiler das Evaluieren und fest in Binary schreiben und nicht zu
Laufzeit berechnen.
Imonbln schrieb:> Er garantiert dir aber nicht das char immer exakt ein Byte hat
Doch! Im Standard ist 1 char = 1 Byte fest definiert. Allerdings ist die
Anzahl Bits in einem byte nicht unbedingt 8, sondern kann auch größer
sein.
A. S. schrieb:> Warum muss eine 64bit CPU auch einen 64bit Adressraum haben?
Was genau heisst "haben"? Logischer und physikalischer Adressraum sind
nicht dasselbe.
Georg
Simon schrieb:> Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit Rechnerarchitektur 8> Bytes.
So allgemein kann man das nicht sagen. Aber in der Regel ist es so.
Bobby X schrieb:> foobar schrieb:>> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat>> oder eine 64-Bit CPU, die im 32-Bit-Modus läuft.>> Stimmt nicht.> Es zeigt, dass der Compiler den Source Code für ein 32 bit System> compiliert.
Und zur Ausführung des Programms wird der Prozessor vorübergehend in den
32-Bit-Modus geschaltet.
> Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das> System später haben wird, auf dem das Programm läuft, spielt hier keine> Rolle.
Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen;
auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das
sowohl die Hardware, als auch das Betriebssystem das unterstützt Von
daher spielt es offenbar sehr wohl eine Rolle.
A. S. schrieb:> Warum muss eine 64bit CPU auch einen 64bit Adressraum haben?
Sie muss nicht. Aber kennst du eine gängige CPU-Architektur, bei der das
nicht so ist?
> Oder ein warum sollte sie.
Das wird im allgemeinen als der größte Vorteil von 64-Bit-Architekturen
gesehen. Der größere Adressraum ist der Hauptgrund, weshalb man PCs auf
64 Bit umgestellt hat, weshalb man inzwischen auch schon die Handys auf
64 Bit umgestellt.
Imonbln schrieb:> Simon schrieb:>> Wird der Operator sizeof>> auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch>> des Feldes in Bytes.>> Das ist so nicht ganz korrekt,
Doch, das ist absolut korrekt.
> sizeof gibt dir den Speicherverbrauch des Feldes als Vielfaches von char.> Der C-Standard iso9899:1999 garantiert dir das sizeof(char) == 1 ist. Er> garantiert dir aber nicht das char immer exakt ein Byte hat.
Doch, tut er - explizt. Er garantiert dir nur nicht, dass ein Byte genau
8 Bit hat. Ein Byte darf auch 9 oder 12 oder 32 Bit breit sein, es darf
nur nicht kleiner als 8 Bit sein.
Rolf M. schrieb:> Bobby X schrieb:>> foobar schrieb:>>> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat>>> oder eine 64-Bit CPU, die im 32-Bit-Modus läuft.>>>> Stimmt nicht.>> Es zeigt, dass der Compiler den Source Code für ein 32 bit System>> compiliert.>> Und zur Ausführung des Programms wird der Prozessor vorübergehend in den> 32-Bit-Modus geschaltet.>>> Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das>> System später haben wird, auf dem das Programm läuft, spielt hier keine>> Rolle.>> Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen;> auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das> sowohl die Hardware, als auch das Betriebssystem das unterstützt Von> daher spielt es offenbar sehr wohl eine Rolle.
Die Programmiersprache, C in diesem Fall, "weiss nicht" auf welcher
Platform, CPU usw.... das in ihr geschriebene Programm laufen wird. Die
Programmiersprache selbst und ihre Implementierung/Ausführungsbedinungen
auf jeweiligen Platformen sind zwei verschiedene Dinge.
Ähnlich ist es mit den calling convention. Das was in C ein
Funktionsaufruf ist, kann auf verschiedene Art und weise realisiert
werden. Aus Sicht von C ist das aber stets "nur" ein Funktionsaufruf.
Bobby X schrieb:>> Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen;>> auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das>> sowohl die Hardware, als auch das Betriebssystem das unterstützt Von>> daher spielt es offenbar sehr wohl eine Rolle.>> Die Programmiersprache, C in diesem Fall, "weiss nicht" auf welcher> Platform, CPU usw.... das in ihr geschriebene Programm laufen wird.
Natürlich nicht, aber worauf willst du hinaus? Es geht hier um die
Ausgabe, die ein für eine spezifische Plattform generiertes Programm bei
seiner Ausführung produziert hat. Dort war die Größe eines Zeigers 4
statt der erwarteten 8 Bytes.