objekt an bestimmter speicheradresse erzeugen?



  • geht das? also ohne pointer bzw. referenzen.
    😕



  • ohne zeiger wirst du's schwer haben 😉
    aber sowas in der art:

    super_foo *x = new (reinterpret_cast<super_foo*>(0xAFFE)) super_foo;
    

    ist nicht verboten, aber sinnig wahrscheinlich nur in Ausnahmefällen.



  • schade. ich war mir doch sicher, sowas im stroustrup gelesen zu haben, aber ich finds auch nicht wieder...



  • Was bringt's dir? 😕



  • hardware-programmierung 😉



  • ? Kannste das bitte mal etwas genauer ausführen? irgendwie sieh ich das noch nicht so ganz...

    -junix



  • die hardware kann über gewissen register (nichts weiter als bestimmte speicheradressen) gesteuert werden. dh, du musst zb. bei 0x4000000 die einstellungen für den videomode schreiben, wobei wiederum die ersten 3 bits für den verwendeten mode selbst verwendet werden und die restlichen bits jeweils für andere optionen. um das ganze bequem anzusteuern will ich mich natürlich nicht dauernd mit speicheradressen und bit-shifts rumärgern, also erstell ich einfach ein struct mit einem auf das register zugeschnittenem bitfield (-> googlen falls nicht bekannt) um das ganze bequem zu benutzen. nun könnte ich natürlich einfach einen pointer erstellen und auf den entsprechenden speicherbereich zeigen lassen, aber ich will ja nicht unnötig leistung verschenken, also dacht ich mir, ich könnte das objekt gleich auf dem register erzeugen.



  • Hm? Hab ich geschrieben es geht nicht?
    Ich hab doch sogar ein Beispiel gegeben..
    Aber gut nochmal 🙂

    struct dein_bitfeld {
       int mode : 3;
       int was_auch_immer : 29;
       //etc
    };
    
    dein_bitfeld *blub = new (reinterpret_cast<dein_bitfeld*>(0x40000000)) dein_bitfeld;
    
    blub->mode = 42; //Holla, geht sich diesmal nicht ganz aus ;)
    

    allerdings ist es gefährlich, wenn manche compiler padding bytes einbauen.
    außerdem geht das unter modernen betriebssystemen sowieso nicht mehr.

    /* oder so wie unter mir */



  • Geht nicht direkt. Ein konstanter Pointer wär da das richtige IMHO, hoffentlich optimiert der Compiler dann die "verschenkte Leistung" heraus ...

    struct register_layout { /* bitfelder */ };
    register_layout * const the_register = reinterpret_cast<register_layout*>(0x40000000);
    

    @davie: so wie ich das verstanden habe, will er gar kein Objekt *erzeugen* im sinne von Aufruf des Konstruktors.



  • hmm, bevor ich jetzt das reinterpret_cast nachschlage, was spricht denn gegen:

    sREG_DISPCNT &DISPCNT;
    

    als membervariable (referenz), welche durch

    SysGBA::SysGBA() :DISPCNT(*(sREG_DISPCNT*)0x4000000)
    

    auf die entsprechende adresse geleitet wird? wo ist der unterschied?



  • reinterpret_cast ist ein C++ Cast, du verwendest den C-Cast.



  • hmm...und? irgendwie sieht das c-cast besser aus...



  • nur kürzer. damit erweckst du vielleicht bei manchen leuten den eindruck, du wüsstest nicht, was du tust (nämlich einen nicht immer ganz unbedenklichen cast sozusagen "verharmlosen")


Anmelden zum Antworten