Zeiger auf irgendwas immer 4 Byte gross ?
-
walljumper schrieb:
&foo ist ein Zeiger auf foo.
versteh ich so:
&int ist ein Zeiger auf int.und das ist falsch.
btw: wenn foo eine int Variable ist stimmt der satz auch nicht dann gibt &foo die adresse von foo zurück.Ne du, deine Einwände stimmen imho nicht. Ist foo vom Typ int, dann ist &foo vom Typ int*, also ein Zeiger. Dass da ne Adresse drin stehen kann ist ne andere Sache.
Auch dein Verständnis ist nicht ganz richtig. Man sagt nicht, foo* ist Zeiger auf foo, sondern foo* ist der Typ eines Zeigers auf foo. Das sind elementar verschiedene Sachen.
-
LordJaxom schrieb:
Und was glaubst Du was eine Adresse (&foo) im Kontext sizeof dann für einen Typ hat? double?
size_t ?
-
Ne du, deine Einwände stimmen imho nicht. Ist foo vom Typ int, dann ist &foo vom Typ int*, also ein Zeiger. Dass da ne Adresse drin stehen kann ist ne andere Sache.
hmm klingt einleuchtend obwohl mein It Lehrer das anders gesagt naja vieleicht auch nur damit es auch die anderen Verstehen.
Auch dein Verständnis ist nicht ganz richtig. Man sagt nicht, foo* ist Zeiger auf foo, sondern foo* ist der Typ eines Zeigers auf foo. Das sind elementar verschiedene Sachen.
siehe oben
Und was glaubst Du was eine Adresse (&foo) im Kontext sizeof dann für einen Typ hat? double?
size_t ?
Ich glaub er meinte den Wert.
Naja und das wird 4 sein.
camper hat auf Seite 1 eine wunderbare Erklaerung geschrieben.
Das erklärt aber nicht das Verhalten von lolzs code. Es erklärt nur das ein Zeiger auf ein Datum das kleiner ist als die Wortbreite einen größeren Zeiger benötigt. Selbst wenn man ein einzelnes Bit adressieren wollte bräuchte man auf einer x86 maschine höchstens 4byte und 3 Bit der code von lolz gibt aber 12 aus es kann also kein zeiger sein.
Da es in C++ keinen Datentyp gibt der kleiner als 1Byte ist und die normale Wortbreite 1Byte ist sind alle Zeiger gleich groß.
-
walljumper schrieb:
camper hat auf Seite 1 eine wunderbare Erklaerung geschrieben.
Das erklärt aber nicht das Verhalten von lolzs code. Es erklärt nur das ein Zeiger auf ein Datum das kleiner ist als die Wortbreite einen größeren Zeiger benötigt. Selbst wenn man ein einzelnes Bit adressieren wollte bräuchte man auf einer x86 maschine höchstens 4byte und 3 Bit der code von lolz gibt aber 12 aus es kann also kein zeiger sein.
Wieso kann es kein Zeiger sein? Weil Zeiger alle 4 Byte gross sind? Schoener Zirkelschluss.
-
walljumper schrieb:
Da es in C++ keinen Datentyp gibt der kleiner als 1Byte ist und die normale Wortbreite 1Byte ist sind alle Zeiger gleich groß.

-
Wieso kann es kein Zeiger sein? Weil Zeiger alle 4 Byte gross sind? Schoener Zirkelschluss.
Ein größerer Zeiger macht einfach keinen Sinn. mit 4Byte und 3Bit kann man schon jedes Bit in einem 4gb Arbeitsspeicher adressieren. mit 8 byte und 3 bit schon in 16Exabyte
12byte das sind 96 bit damit könnte man ja 2^96 byte Ram adressieren wo gibts den sowas?@Michael E. Sehr Aussage kräftig dein post.
-
walljumper schrieb:
Ein größerer Zeiger macht einfach keinen Sinn. mit 4Byte und 3Bit kann man schon jedes Bit in einem 4gb Arbeitsspeicher adressieren. mit 8 byte und 3 bit schon in 16Exabyte
12byte das sind 96 bit damit könnte man ja 2^96 byte Ram adressieren wo gibts den sowas?wer sagt denn dass ein zeiger immer eine lineare adresse ist? ein zeiger kann auch aus verschiedenen komponenten bestehen, z.b page und offset. das ist architekturabhängig. es gibt nicht nur x86 kisten (und selbst die haben noch andere speicheraufteilungen ausser dem 'flat-mode')
:xmas2:
-
bei einer relativen adresse wird der zeiger aber höchstens kleiner.
es gibt nicht nur x86 kisten
die meisten werden aber für x86 kisten c++ programmieren.
is ja schön und gut wir haben jetzt festgestellt das es Zeiger gibt die kleiner als 4 Byte sind und welche die größer sind. Aber auf ner normalen x86 kiste die zu 99% den flat modus nutzt hat ein zeiger der auf min 1 byte daten zeigt immer 4 Byte.
Und die anderen Speichermodelle usw. erklären alle nicht das Verhalten von lolzs code .
-
walljumper schrieb:
die meisten werden aber für x86 kisten c++ programmieren.
da wär ich mir nicht so sicher.
walljumper schrieb:
Und die anderen Speichermodelle usw. erklären alle nicht das Verhalten von lolzs code
den versteh ich auch nicht, dazu kann ich zu wenig c++ (bin eigentlich c-coder)
irgendwie ist es ein function pointer, der aber mehr informationen zu beinhalten scheint als nur die adresse einer funktion. wahrscheinlich noch die adresse der basisklasse und der vtable oder RTTI informationen? keine ahnung...
vielleicht kann uns ja jemand erleuchten.
:xmas2:
-
walljumper schrieb:
Und die anderen Speichermodelle usw. erklären alle nicht das Verhalten von lolzs code .
Falls Du uns immernoch nicht glaubst dass der angesprochene Code die Größe eines Zeigers ausgibt, versuch mal das:
#include <iostream> class Base { public: virtual void doIt() = 0; }; class Derived : public virtual Base { public: void doIt(){} }; int main() { typedef void(Derived::*zeiger)(); zeiger x = &Derived::doIt; std::cout << sizeof( int* ) << std::endl; std::cout << sizeof( zeiger ) << std::endl; }EDIT:
Zur Erklärung siehe http://www.codeproject.com/cpp/FastDelegate.asp - Abschnitt "why are they so complex"
-
walljumpter: Dann guck dir bitte nochmal an, wie groß en Wort ist.
-
LordJaxom schrieb:
Zur Erklärung siehe http://www.codeproject.com/cpp/FastDelegate.asp - Abschnitt "why are they so complex"
dankeschön

wieder ein grund mehr, c++ zu hassen
-
Falls Du uns immernoch nicht glaubst dass der angesprochene Code die Größe eines Zeigers ausgibt, versuch mal das:
Ich wollte ja nur eine Erklärung. Die hast du ja jetzt gegeben. Aber nachdem würde ich es trotzdem nicht zeiger nennen. Wenn da sogar verschiedene Compiler verschiedene Zeigergrößen draus machen, ist wohl eher ein verschachtelter datentyp.
walljumpter: Dann guck dir bitte nochmal an, wie groß en Wort ist.
Es ist nicht die rede von dem C++ Datentyp Word , der hat natürlich 2 Byte, sondern von einer Architektur eigenschaft die angibt wie die Daten im Ram organisiert sind.
bei x86 ist das eben 8 Bit früher in den groß Rechnern waren es meistens mehr ibm hatte glaube ich langezeit 36 Bit.
-
http://de.wikipedia.org/wiki/X86#Real_Mode, letzter Abschnitt.
http://de.wikipedia.org/wiki/X86#64_Bit
-
Das ist wieder ein anderes Wort ^^ diesmal eben in der CPU.
Gemeint ist natürlich die kleinste adressierbare Speichereinheit im ram.
-
walljumper es gibt einmal das Konzept eines Zeigers und dann gibt es die konkrete Implementierung eines Zeigers, zum Beispiel auf einer Architektur. Der C++-Standard hat ebenfalls ein Konzept eines Zeigers und die Umsetzung wird den Bauern eines Compilers überlassen. Diese haben die Aufgabe ein C++-Programm in ein äquivalentes Maschinencode-Programm (für eine konkrete Architektur/Plattform) umzuwandeln.
Die Antwort ist möglicherweise unbefriedigend, aber mir fällt es schwer sowas inituitives zu beschreiben. Ich glaube du siehst gerade den Wald vor lauter Bäumen nicht mehr. Lies dir Morgen den Thread nochmal durch, ich denke, dann verstehst du es

-
walljumper schrieb:
Das ist wieder ein anderes Wort ^^ diesmal eben in der CPU.
Gemeint ist natürlich die kleinste adressierbare Speichereinheit im ram.Kannst du mir ne Quelle zeigen, in der 1 Wort = 1 Byte ist?
-
Ich hab das aus einem Buch "Computerarchitektur Strukturen-konzepte-Grundlagen" von Andrew S.Tanenbaum . Ich bin gerade noch dabei eine online quelle zu suchen wikipedia hilft leider nicht.
-
-
das ist natürlich korrekt aber ich meine etwas anderes. Ein Wort kann mit beliebiger Länge definiert sein steht ja auch bei deinem link(ganz unten) und der Speicher ist nunmal in 8 Bit Worten organisiert. Daraus ergibt sich ja auch zusammen mit der Wortlänge der CPU der maximale Speicher ausbau von 4 gb
wäre ein Wort im Speicher 16 Bit breit wären es 8gb