Zeiger auf irgendwas immer 4 Byte gross ?
-
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
-
Die kleinste adressierbare Einheit ist ein Byte. Ein Wort ist die Datengröße, die gleichzeitig von dem System verarbeitet werden kann, also die Busbreite. Der Bus ist beim x86 32 Bit groß, also ist ein Wort hier 32 Bit groß (manchmal auch 16 Bit und 32 Bit wird dann als dword bezeichnet, aber das nur aus historischen Gründen).
Jetzt sag mir bitte, warum ein Byte im RAM Wort heißen soll.
-
weil es da die kleinste einheit ist. Ich weis auch nicht in wie weit diese Bezeichnung verbreitet ist aber ich hab es so schon gehört und in campers erklärung wird es auch so verwendet.
-
LordJaxom schrieb:
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,
Das mag sein, aber ein Zeiger auf Klassenmember ist auch etwas fundamental anderes als ein gewöhnlicher Zeiger auf Objekte oder Funktionen. Ich habe nicht den Eindruck, dass diese Klasse von Zeigern gemeint war.
walljumper schrieb:
Wieso kann es kein Zeiger sein? Weil Zeiger alle 4 Byte gross sind? Schoener Zirkelschluss.
Ein größerer Zeiger macht einfach keinen Sinn.
Eine gewagte Annahme. Und wer sagt, dass jede Entscheidung einer Architektur (in deinen Augen) Sinn machen muss? Sobald unser Addressraum nichtlinear wird (und das Speichermodell vonn C++ erlaubt das ausdrücklich), sind sehr viele seltsame Dinge möglich. Schon im 16bit x86 modus kennen wir das: der Adressraum is 1MB groß, unsere Zeiger haben aber 32bit und nicht nur 20. Im Gegenzug kann dann ein und dasselbe Objekt durch viele (in ihrer Representation) verschiedene Zeiger addressiert werden. Die Umwandlung eines Zeigers auf einen Typ mit starken Alignmentvoraussetzung in einen Zeiger mit schwächeren Alignmentvorausstzungen ist ohne Informationsverlust möglich. Daraus können wir aber nur schließen, dass der erste Zeiger möglicherweise weniger bits für die Wert-Repräsentation verwendet. Über die Objekt-Repräsentation ist damit nichts gesagt. Es steht einer Plattform frei, zusätzliche Bits etwa für Traps zu benutzen.
-
Michael E. schrieb:
Die kleinste adressierbare Einheit ist ein Byte. Ein Wort ist die Datengröße, die gleichzeitig von dem System verarbeitet werden kann, also die Busbreite. Der Bus ist beim x86 32 Bit groß, also ist ein Wort hier 32 Bit groß (manchmal auch 16 Bit und 32 Bit wird dann als dword bezeichnet, aber das nur aus historischen Gründen).
Jetzt sag mir bitte, warum ein Byte im RAM Wort heißen soll.
Der Begriff des Wortes wird unterschiedlich verwendet. Warum das hier zu Diskussionen führt, ist mir unverständlich - schließlich schloss sich bei mir nicht zufällig noch ein Satz an, der die Bedeutung dieses Begriffes in meinem Beitrag klären sollte.
-
camper schrieb:
Das mag sein, aber ein Zeiger auf Klassenmember ist auch etwas fundamental anderes als ein gewöhnlicher Zeiger auf Objekte oder Funktionen. Ich habe nicht den Eindruck, dass diese Klasse von Zeigern gemeint war.
Ich ging in diesem Forum grundsätzlich von dem aus, was "Zeiger" in C++ bedeuten kann. Auf Maschinenebene sieht das natürlich anders aus

-
@walljumper: Eine x86 CPU verwendet intern 32 Bit Register um Bytes zu adressieren, daher ist der Adressraum 4GB gross. Extern verwendet eine x86 CPU allerdings nurmehr 30 Bit um ein DWORD zu adressieren, und wie der Speicher organisiert ist ist dann schon vollkommen egal. Der Speicher könnte 64 Bit, 128 Bit oder sogar 384 Bit Einheiten verwenden. I.A. werden auch immer bloss gesamte Cache-Lines gelesen oder geschrieben - das hat mit einem "Byte" oder der "Wortgrösse" der CPU nixmehr zu tun.