volatile



  • ...



  • Ich wollte das nur wissen, da ich mir vor kurzem überlegte wie man nen string in ner exe verändern kann und dazu müsste man halt sicher sein, dass sich keine strings überlappen.



  • Was heißt "String in ner exe verändern" und "sich überlappen"?



  • Ganz einfach exe öffnen String ändern und speichern.

    Mit überlappen meinte ich, dass Compiler doch beim optimieren z.B. Eis und Schokoladeneis zusammenfassen können, da ja die gleichen Buchstaben darin vorkommen, zumindest hab ich das so schon gelesen.



  • Lohnt sich das String zusammenlegen denn heute wirklich noch? Wo kann man so einen Kram nachlesen?



  • SirLant: "Eis" kommt in "Schokoladeneis" aber nicht vor 🙄



  • @SirLant
    Beim GCC gibt es die Option -fwritable-strings damit könntest du so etwas erreichen. Aber seit dem 3.4er ist die depprecated und im 4.0er wird sie entfernt (dem nächsten Release).

    Im normalfall sollte sich so etwas eh nicht lohnen, außer du programmierst irgend einen extrem limitierten µC



  • HumeSikkins schrieb:

    Die einzige legale Konvertierung für einen Pointer die hier möglich ist, ist die nach bool.

    das ist aber wirklich dämlich gemacht. cout äääh der compiler hätte wenigstens ein warning ausspucken können, zumal er ohne 'volatile' auch gut klar kommt. ein pointer hat mit einem bool wirklich nix gemeinsam.

    HumeSikkins schrieb:

    Diese Konvertierung ist in diesem Fall sicher etwas unintuitiv.

    etwas? hätte er wenigstens 'unsigned int' draus machen können

    HumeSikkins schrieb:

    Auf der anderen Seite hat man schon vor Tausend Jahren Code à la:

    void func(const char* s)
    {
        if (s)
            ...
    }
    

    und dazu braucht man diese Konvertierung nun mal.

    das stammt aus der vor-bool zeit. null ist 'falsch' alles andere 'wahr'. das gehört zu den altlasten, die c++ mit sich rumschleppt. in java z.b. geht das nicht. wenn es da char* gäbe müsste man schreiben 'if (s != null)'



  • Es ist ganz sicher eine Altlast, aber es gibt noch unglaublich viele C++ Programmierer (die Mehrzahl?), die das so schreibt. Ich fürchte, damit muss man sich abfinden.



  • Optimizer schrieb:

    Ich fürchte, damit muss man sich abfinden.

    mich stört's nicht. c++ gibt dem user viele freiheiten. (nur c ist noch besser :D). dass dabei manchmal so'n mist rauskommt wie 'heimliche' konvertierung von pointern in bools muss man einfach tolerieren...



  • HumeSikkins schrieb:

    template <class T>
    ostream& operator<<(ostream& os, volatile T* ptr)
    {
         // ...
         os << const_cast<T*>(ptr);
         return os;     
    }
    

    ist aber nicht viel besser, als UB 😉
    sollte doch wohl eher so heißen:

    template <class T>
    ostream& operator<<(ostream& os, T const volatile * ptr) 
    {
         // ...
         os.operator<<(const_cast<T*>(ptr));
         //oder: out << static_cast<void*>(const_cast<T*>(t));
         return os;     
    }
    

Anmelden zum Antworten