Zeiger auf irgendwas immer 4 Byte gross ?



  • 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.


  • Mod

    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.


  • Mod

    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.



  • @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.

    ganz großes Kino. Wie oft muss ich eigentlich noch sagen das die cpu nicht gemeint war. btw.Auserdem stimmt was du schreibst so nicht. Der maximale Speicherausbau hängt sehr wohl mit von der Speicher organisation ab. Auserdem was hat das damit zu tun das immer ganze Cachelines gelesen werden?

    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.
    

    Das geht aber scheinbar in manche Köpfe nicht rein.


  • Mod

    LordJaxom schrieb:

    Ich ging in diesem Forum grundsätzlich von dem aus, was "Zeiger" in C++ bedeuten kann.

    Das Problem ist, dass - zugespitzt formuliert - Zeiger auf Member oder Zeiger auf Memberfunktionen keine Zeiger sind. Ein Zeiger ist jedenfalls etwas, dass auf etwas anderes verweist. Den Verweis lösen wir dann mittels des Dereferenzierungsoperators * auf.
    Für Zeiger auf Member und Memberfunktionen gilt das nicht. Abstrakt gesehen sind das Funktionen, die erst durch Anwendung eines Objekt- oder Zeigerparameters auf ein Objekt oder eine Funktion verweisen. Aus diesem Grunde halte ich es für verwirrend, sie im Zusammenhang dieses Threads gemeinsam zu behandeln. Keinesfalls geht es mir dabei um die konkrete Repräsentation durch den Compiler.



  • SG1 schrieb:

    walljumper schrieb:

    lolz schrieb:

    Außerdem muss nicht jeder Zeiger 4Byte groß sein.

    Könnt ja mal spaßeshalber folgendes testen:

    #include <iostream>
    
    class Base
    {
      public:
        virtual void doIt() = 0;
    };
    
    class Derived : public virtual Base
    {
      public:
        void doIt(){}
    };
    
    int main()
    {
       std::cout << sizeof( &Derived::doIt );
    }
    

    @lolz

    dein code gibt bestimmt nicht die größe eines Zeigers aus mit & werden referenzen angegeben oder addresse eines objekts zurückgegeben.Zeiger werden mit * gekennzeichnet.

    &foo ist ein Zeiger auf foo.

    😃 😃 😃

    Ein gutes Beispiel für ein amoklaufendes Beispiel (angetrieben durch diverse Eitelkeiten) ....

    Ist doch ganz einfach:
    "&Derived::doIt zeigt auf die Funktion doIt() der Klasse Derived".

    Fertig, kein Grund für "foo", 2 Seiten Posts darüber und auch keiner, sich über Kompetenzen aufzuregen.

    Gruß,

    Simon2.


  • Mod

    Simon2 schrieb:

    Ist doch ganz einfach:
    "&Derived::doIt zeigt auf die Funktion doIt() der Klasse Derived".

    Und wieso wird dann hier

    #include <iostream>
    
    class Base
    {
      public:
        virtual void doIt() = 0;
    };
    
    class Derived : public virtual Base
    {
      public:
        void doIt(){ std::cout << "Derived::doIt\n"; }
    };
    
    class Derived2 : public Derived
    {
      public:
        void doIt(){ std::cout << "Derived2::doIt\n"; }
    };
    
    int main()
    {
    	Derived2 foo;
    	void (Derived::*p)() = &Derived::doIt;
    	(foo.*p)();
    }
    

    Derived2::doIt ausgegeben?



  • camper schrieb:

    ...Und wieso wird dann hier...Derived2::doIt ausgegeben?

    😕
    Wieso sollte das ein Argument gegen meine Aussage sein ?

    Gruß,

    Simon2.


  • Mod

    Simon2 schrieb:

    camper schrieb:

    ...Und wieso wird dann hier...Derived2::doIt ausgegeben?

    😕
    Wieso sollte das ein Argument gegen meine Aussage sein ?

    Gruß,

    Simon2.

    nicht dagegen. Deine Aussage ist allerdings missverständlich. Dein Begriff des Zeigens ist hier so weit gefasst, dass man ihn ohne zusätzliche Erklärung kaum verstehen kann. Was daran dann einfach sein soll, entzieht sich meinem Verständniss. Es dürfte viele Anfänger geben, die von dem Ergebnis meines Beispiels überrascht sind.



  • camper schrieb:

    ...Deine Aussage ist allerdings missverständlich. Dein Begriff des Zeigens ist hier so weit gefasst, dass man ihn ohne zusätzliche Erklärung kaum verstehen kann. Was daran dann einfach sein soll, entzieht sich meinem Verständniss. Es dürfte viele Anfänger geben, die von dem Ergebnis meines Beispiels überrascht sind.

    Nun, im Zusammenhang finde ich das wenig mißverständlich (geht einem ja immer so bei den eigenen Aussagen 😉 ) ...

    Es geht mir nur darum:
    A lolz bietet Code an, der die Größe eines Zeigers berechnet
    B wallpaper mißversteht die Syntax ("... & ist Referenz ...")
    C Eine lange Diskussion über "foo" und wallpapers Kompetenz startet und dauert.

    IMO wäre C vollkommen überflüssig gewesen, wenn man wallpaper ganz kurz übers einen Irrtum aufgeklärt hätte.

    Leider ist es in diesem Forum schon fast "üblich", Anderen, die eine falsche/mißverständliche/... Formulierung benutzten, sofort
    - Generalinkompetenz zu- und
    - deswegen jegliche Äußerungs-/Lebensberechtigung abzusprechen.
    (Dass Du z.B. nicht damit gemeint bist, ist Dir hoffentlich klar)

    Das führt leider zu langen Scheingefechten, Beleidigungen und anderem Quatsch, der es bisweilen unerfreulich macht, hier unterwegs zu sein. .... aber das ist eine andere Geschichte...

    Ich freue mich an den guten Beiträgen von Dir, CStoll, ... und den anderen "Recken", solange die Pöbler das noch nicht überwiegen.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Leider ist es in diesem Forum schon fast "üblich", Anderen, die eine falsche/mißverständliche/... Formulierung benutzten, sofort
    - Generalkompetenz zu- und
    - deswegen jegliche Äußerungs-/Lebensberechtigung abzusprechen.

    gut erkannt.
    einfach drüber hinwegsehen
    :xmas2:



  • ten schrieb:

    ...
    einfach drüber hinwegsehen
    :xmas2:

    Ich arbeite da an mir. 🙂
    (gezieltes Ignorieren ist gar nicht so einfach)

    Gruß,

    Simon2.



  • Edit ! Knopf verwechselt.


Anmelden zum Antworten