CyberDemon Geschrieben 10. März 2003 Geschrieben 10. März 2003 Hi! Wenn ich einen Zeiger auf eine int - Variable (oder float, double, etc.) erzeuge, hat der Zeiger dann die gleiche Bytegröße? Also: int 2 Byte ; Zeiger auf int auch 2 Byte char 1 Byte ; Zeiger auf char 1 Byte float 4 Byte ; Zeiger auf float 4 Byte Oder haben Zeiger immer die gleiche Bytegröße? Thanx 2 all! Zitieren
Guybrush Threepwood Geschrieben 10. März 2003 Geschrieben 10. März 2003 Hi, ein Zeiger ist immer 4 Byte groß, egal auf welchen Typ er zeigt. Das liegt daran, dass er ja nur die Adresse einer anderen Variable enthält. Gruß Guybrush Zitieren
gugelhupf Geschrieben 10. März 2003 Geschrieben 10. März 2003 Originally posted by Guybrush Threepwood Hi, ein Zeiger ist immer 4 Byte groß, egal auf welchen Typ er zeigt. Das liegt daran, dass er ja nur die Adresse einer anderen Variable enthält. Gruß Guybrush Und 4 Byte deswegen, weil Windows jedem Programm einen virtuellen Speicherbereich von 4GB zuteilt. Um jede dieser Adressen erreichen zu können sind eben 2 hoch 32 Bit nötig. Zitieren
CyberDemon Geschrieben 10. März 2003 Autor Geschrieben 10. März 2003 Erstmal vielen Dank :uli Und 4 Byte deswegen, weil Windows jedem Programm einen virtuellen Speicherbereich von 4GB zuteilt. Um jede dieser Adressen erreichen zu können sind eben 2 hoch 32 Bit nötig. Demnach sind Zeiger auf 16Bit Maschinen 2 Byte groß :confused: Zitieren
gugelhupf Geschrieben 10. März 2003 Geschrieben 10. März 2003 Das hat mit der Hardware weniger zu tun. Es kommt auf das OS an. Und Windows (nie aktuellen Releases) verwaltet eben 4GB virtuellen Speicher- und Adressierbreich. Zitieren
nic_power Geschrieben 10. März 2003 Geschrieben 10. März 2003 Originally posted by Guybrush Threepwood ein Zeiger ist immer 4 Byte groß, egal auf welchen Typ er zeigt. Die Größe ist vom Betriebssystem und der zu Grunde liegenden Prozessorarchitektur abhängig. Bei 32 Bit-Systemen üblicherweise 32 Bit (also 4 Byte), bei 64 Bit-Systemen je nach OS (und gegebenenfalls Compileroptionen) 32 oder 64 Bit! Wenn notwendig sollte man immer mit "sizeof()" arbeiten und sich nie darauf verlassen, dass Zeiger eine bestimmte Größe haben. Nic Zitieren
SgtBadAzz Geschrieben 12. März 2003 Geschrieben 12. März 2003 Originally posted by CyberDemon Erstmal vielen Dank :uli Demnach sind Zeiger auf 16Bit Maschinen 2 Byte groß :confused: Auf Intel 8086 ( 16 bit) sind das 20 Bit. Frank Zitieren
Crow T. Robot Geschrieben 12. März 2003 Geschrieben 12. März 2003 Die Größe eines Zeigers hängt von der eingesetzten Basismaschine ab, das OS hat damit nichts zu tun. Konkret wird es hier wohl auf die Breite der Adressregister im Prozessor ankommen. Bei einem reinen 16-Bit-System ist ein Zeiger auch 16 Bit "breit", bei einem reinen 32-Bit-System ist er 32 Bit usw. Dann gibt es noch Mischformen, etwa 20- oder 24bittige Adressen auf 16-Bit-Maschinen. Die älteren Amigas z.B. konnten nur 24 Bit adressieren, die Adressregister im MC68k waren aber trotzdem 32 Bit groß; das höchste Byte wurde dabei einfach ignoriert und wurde von findigen Codern als "Datenspeicher" missbraucht. Auf jeden Fall findet man die korrekte Grösse eines Zeigers immer mit dem sizeof()-Operator heraus, und das ist das wichtigste. Wenn ein Programm also auf die Kenntnis der Zeigergröße angewiesen ist, dann hat das Programm diese eben mit sizeof() zu ermitteln. Zitieren
nic_power Geschrieben 12. März 2003 Geschrieben 12. März 2003 Originally posted by Crow T. Robot Die Größe eines Zeigers hängt von der eingesetzten Basismaschine ab, das OS hat damit nichts zu tun. Die Aussage ist nicht korrekt. Gerade bei den 64-Bit Architekturen gibt es fast immer die Möglichkeit, 32 oder 64 Bit Versionen eines Betriebssystems zu installieren (das betrifft beispielsweise HPUX oder auch Solaris). HPUX11.0 existiert für PARISC-2.0 (64 Bit Architektur) sowohl in einer 32 Bit Version (Pointergroesse 32 Bit) als auch in einer 64-Bit Version (die Pointergroesse betraegt in diesem Fall 32 oder 64 Bit, je nach dem welches Datenmodell beim compilieren verwendet wird). Auf den 32 Bit-Version von HPUX laeuft kein 64 Bit Code auch wenn es sich bei der Prozessorarchitektur um eine 64 Bit-Architektur handelt. Nic Zitieren
Crow T. Robot Geschrieben 13. März 2003 Geschrieben 13. März 2003 Hmmm.... Mit den Interna von RISC-Systemen kenne ich mich ehrlich gesagt nicht aus. Wenn das OS in zwei Varianten existiert, dann muss der Code doch sicherlich speziell für diese Umgebung kompiliert werden, richtig? Aber ist das nur notwendig, um mit den System-APIs korrekt kommunizieren zu können, oder würden prozessornahe Programme auch nicht mehr funktionieren? :confused: Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Crow T. Robot Wenn das OS in zwei Varianten existiert, dann muss der Code doch sicherlich um mit den System-APIs korrekt kommunizieren zu können,... oder würden prozessornahe Programme auch nicht mehr funktionieren? :confused: Also auf meinem Solaris 9 auf UltraSparc2 ist es so, das es 64 Bit - fähig ist aber trotzdem auch noch 32 Bit Applikationen darauf laufen können. Was sind denn prozessornahe Programme ? Frank Zitieren
Crow T. Robot Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by SgtBadAzz Also auf meinem Solaris 9 auf UltraSparc2 ist es so, das es 64 Bit - fähig ist aber trotzdem auch noch 32 Bit Applikationen darauf laufen können. Interessehalber: Wie "groß" sind dann die Zeiger? :confused: "Prozessornah" ist vielleicht unglücklich ausgedrückt. Ich meinte eigentlich Programme, die unabhängig vom OS laufen, z.B. wenn dieses noch gar nicht geladen wurde. Dann "weiss" der Code ja noch gar nichts von dieser Umgebung und ob diese 16, 32 oder 64 Bit nutzt. Dann ist der Code quasi nur von der Prozessor-Umgebung abhängig... War das verständlich? Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by Crow T. Robot Interessehalber: Wie "groß" sind dann die Zeiger? :confused: Keine Ahnung wie gross die Zeiger sind, aber es geht. Muss mal sehen wie die das machen. Frank Zitieren
nic_power Geschrieben 13. März 2003 Geschrieben 13. März 2003 Hallo, Das Datenmodell (32 oder 64 Bit) wird zur Compilezeit festgelegt und es muessen die korrekten Bibliotheken gelinkt werden (ein "Mischen" des Codes ist nicht moeglich). Die 64 Bit Varianten des Betriebssystems koennen sowohl 32 als auch 64 Bit Executables ausführen. Gesteuert wird der Modus ueber ein Bit im Prozessorstatuswort (bei HPPA das "W" Bit im PSW). D.h. ist dieses Bit auf den Wert "1" gesetzt werden die vollen 64 Bit der CPU ausgenutzt, ansonsten nur 32 Bit berücksichtigt. Die Programme laufen grundsaetzlich unter der Kontrolle des Betriebssystems ab. Das Betriebssystem kuemmert sich darum, welche Modus bei der Ausfuehrung verwendet wird. Code, der nicht unter der Kontrolle des Betriebssystems läuft (wenn er beispielsweise direkt auf die Maschine geladen wird), muss sich selbst um die Wahl des Datenmodells kümmern, das PSW entsprechend setzen, Memory-Management usw. initialisieren (d.h. es implementiert eine Art "Mini-OS"). Nic PS: Du kannst auch auf 32 Bit-Intel CPUs 16 Bit Betriebssysteme (wie aeltere DOS-Versionen) einsetzen. Zitieren
nic_power Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by SgtBadAzz Keine Ahnung wie gross die Zeiger sind, aber es geht. Muss mal sehen wie die das machen. Frank Das hängt auch hier vom Betriebssystem und den Compilerflags ab. Bei der 32 Bit Version 32 Bit, bei der 64 Bit-Version 32 (v8 Architektur) oder 64 Bit (v9). Sowohl Sun als auch HP verwenden bei den 64 Bit Varianten LP64 als Speichermodell. Bei Sun wird - wie auch bei HP - die Umgebung ueber das Prozessorstatusregister (PSTATE) bestimmt. Ist das address_mask Bit auf 1 gesetzt, so wird der Code als 32 Bit Code interpretiert. Nic Zitieren
SgtBadAzz Geschrieben 13. März 2003 Geschrieben 13. März 2003 Originally posted by nic_power Das hängt auch hier vom Betriebssystem und den Compilerflags ab. Bei der 32 Bit Version 32 Bit, bei der 64 Bit-Version 32 (v8 Architektur) oder 64 Bit (v9). Nic Es ist V9 da es ja eine UltraSparc 2 , also 64 Bit. Frank Zitieren
nic_power Geschrieben 13. März 2003 Geschrieben 13. März 2003 Hallo, In dem Fall kannst Du die Pointergroesse per Kommandozeilen-Argument beim Compilieren festlegen. Ich habe mal zwei Beispiele fuer HPUX und Solaris vorbereitet: Erstes Beispiel (Sun Ultra-1, 64 Bit CPU, 64 Bit Solaris): $ cat pointer.c int main() { printf("sizeof(char *) = %d\n", sizeof(char *)); } $ gcc -o pointer pointer.c $ ./pointer sizeof(char *) = 4 $ gcc -m64 -o pointer pointer.c $ ./pointer sizeof(char *) = 8 $ uname -a SunOS sliema 5.8 Generic_108528-16 sun4u sparc SUNW,Ultra-1 $ isalist sparcv9+vis sparcv9 sparcv8plus+vis sparcv8plus sparcv8 sparcv8-fsmuld sparcv7 sparc Zweites Beispiel (HP9000/C360, 64 Bit CPU 32 Bit HPUX11): bash-2.03$ cc -o pointer pointer.c bash-2.03$ ./pointer sizeof(char *) = 4 bash-2.03$ cc +DD64 +DS2.0W +DA2.0W -o pointer pointer.c bash-2.03$ ./pointer bash: ./pointer: cannot execute binary file bash-2.03$ getconf KERNEL_BITS 32 bash-2.03$ getconf HW_CPU_SUPP_BITS 32/64 KERNEL_BITS gibt an, um welche Betriebssystemvariante es sich handelt, HW_CPU_SUPP_BITS was von der CPU unterstuetzt wird. Da das OS nur 32 Bit Support hat, laesst sich der 64 Bit Code (obwohl 64 Bit CPU) nicht ausfuehren. Nic PS: Bei Bedarf kann ich einen Beitrag für die FAQ zusammenstellen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.