Frage zu Stroustrup-Übung
-
Hallo,
Stroustrup stellt in seinem Buch in Kapitel 5.9, Übung 2 folgende Aufgabe:Was sind auf Ihrem System die Beschränkungen für die Zeigertypen char*, int* und void ? Kann beispielsweise ein int* einen ungeraden Wert haben ? Tip: Ausrichtung.
Damit kann ich leider recht wenig anfangen. Ein Zeiger auf ein int enthält ja z.B. nur die Adresse des int, auf welches er zeigt. Da int i.d.R 4 Byte groß ist, müsste der Hexadezimalwert (der die Adresse repräsentiert) gerade sein, wenn das Datensegment bei 0x0 oder 0x2 anfängt, ungerade jedoch, wenn vor dem int Speicher belegt wird, der z.B. 1 Byte (also etwa ein char) groß ist. Wie ist diese Frage zu verstehen. Dann: Was meint Stroustrup mit Ausrichtung ? Ich kann mir darunter in diesem Zusammenhang rel. wenig vorstellen, auch wird das Wort IMHO vorher nicht in diesem Kontext erwähnt. Ist das vielleicht ein Manko der Übersetzung ? Weiterhin frag ich mich, was er mit Beschränkungen meint ?
Es wäre schön, wenn ihr mir da helfen könntet...
Noch einen schönen Sonntag-Abend
Gruß
E-the-Real
-
ethereal schrieb:
Hallo,
Da int i.d.R 4 Byte groß ist, müsste der Hexadezimalwert (der die Adresse repräsentiert) gerade sein, wenn das Datensegment bei 0x0 oder 0x2 anfängt, ungerade jedoch, wenn vor dem int Speicher belegt wird, der z.B. 1 Byte (also etwa ein char) groß ist.1. chars werden immer auf dem heap initialisiert(ob mit new oder ohne)
2. speicher kann auf dem stack immer nur "word"-weise belegt werden. 1word = 4bytemfg, euer ehemaliger bufferoverflow-user, der sich mit dem stack jetzt sehr gut auskennt ^^
-
Apropos Stroustrup.
Gibt es im Netz vielleicht die Lösungen zu den ganzen Übungen? Ohne Lösungen bringen sie imho nicht wirklich viel.
-
...Folglich kann int* nur gerade Werte annehmen, die Vielfache von 4 sind ?
Übrigens, ist ein "Word" nicht 2 Byte ???
-
ethereal schrieb:
...Folglich kann int* nur gerade Werte annehmen, die Vielfache von 4 sind ?
Übrigens, ist ein "Word" nicht 2 Byte ???#include <iostream> int main(void) { int i = 0; int *ptr = &i; std::cout << "ptr: " << ptr << std::endl; ++ptr; std::cout << "ptr: " << ptr << std::endl; return 0; }
ptr: 0x2ff6c
ptr: 0x2ff70also 4.
mfg
-
hmm, Reiner Backer schreibt in "Assembler - Maschinennahes Programmieren von Anfang an",Neuausgabe Nov.2003 , rororo-Verlagauf Seite 48, Kap. 2.6.2:
(...) Zwei Bytes zusammengefasst ergeben die nächste im Computer verwendete Größe, das Wort. Bei der Verarbeitung einer Wort-Größe können zwei Bytes gleichzeitig über den Datenbus transportiert werden.
Ein Wort besteht aus 16 Bit, was zusammengefasst zwei Bytes entspricht. (...)Dann folgt 2.6.3:
Die Nachfolgeprozessoren des 8086 und 80286-Prozessors inklusive Pentium arbeiten intern mit einer Datenbreite von 32 Bit. Diese 32-Bit-Prozessoren können vier Byte auf einmal aus dem Arbeitsspeicher lesen oder zurückschreiben. Ein Doppelwort besteht aus 32 Bit, was umgerechnet zwei Worte oder vier Bytes ergibt. (...)
Sollte etwa mit dem gängigen Wort das Doppelwort gemeint sein, bin ich vielleicht zu Low-Level, oder liegt das an der Plattform ? Denn du hast ja anscheinend auch Recht mit deinen 4 Byte...
Gruß
E-the-Real
-
Wenn man es drauf anlegt, kann int* auch ungerade Werte annehmen:
char a[5] = { 0 }; int* p = reinterpret_cast<int*>(&a[1]); // Auf Alpha-Rechnern Problematisch: cout << *p; *p = 1;
Auf einer x86-Maschine ist es für die Programmausführung irrelevant, ob die Speicheradresse ausgerichtet ist. Wenn sie es nicht ist, dauert der Zugriff halt etwas länger.
IIRC stürzt auf Alpha-Prozessoren ein Programm ab, wenn es auf eine nicht ausgerichtete Speicheradresse zugreifen will; es sei denn das Betriebssystem fängt das Signal und holt den Wert manuell.Ob obiger Code Standard ist, weiß ich nicht genau.
-
Da 32- Bit- Prozessoren am verbreitetsten sind, ist mit Wort eben auch "4 Byte" gemeint, denke ich. Denn die ursprüngliche Definition war, daß unter "Wort" die größte mit einem Vorgang lesbare Datenmenge zu verstehen sei. Beim 16- Bit- Prozessor waren das halt 16 Bit (== 2 Byte), und bei 32 Bit sind es eben 32 Bit (== 4 Byte). Es handelt sich also um eine plattformabhängige Bezeichnung... nach Backers Verständnis dürfte eher die erwähnte Verwechslung stattfinden.
-
hmm.. auf den windows-rechner (start->programme->zubehör->rechner) ist ein Word 16 bit, ein Dword 32 bit
Vielleicht wurde der begriff aus der 16-bit-zeit übernommen.
geloescht
-
Typen müssen auf unterschiedlichen Plattformen nicht immer die gleiche Datenbreite haben. Da es uns aber um die x86 32 bit Architektur geht, ist hier folgendes gültig:
8 bit = 1 byte
2 byte = 1 word
4 byte = 1 dword (double-word)
8 byte = 1 qword (quad-word)
...ethereal schrieb:
Was meint Stroustrup mit Ausrichtung ?
Mit Ausrichtung meint Stroustrup, wie Zeiger im Speicher ausgerichtet werden.
Wie cd9000 schon sagte ist dies auf x86 Plattformen egal (zumindest kann ich das guten Gewissens von 16 und 32 bit Systemen behaupten). Allerdings wird jeder gute Compiler Zeiger auf einer 32 bit Plattform an 4 byte Boundaries ausrichten, da Zugriife somit eindeutig am schnellsten erfolgen.
-
groovemaster2002 schrieb:
Mit Ausrichtung meint Stroustrup, wie Zeiger im Speicher ausgerichtet werden.
...also an welcher Stelle er sich befindet, konkret z.B. Abstand vom Beginn des Datensegments ??? Ich kann mir darunter immer noch rel. wenig vorstellen, trotzdem euch allen erstmal dankeschön für die Antworten !
Gruß
E-the-Real