memset in C++



  • Danke für die Hinweise, das C-Beispiel habe ich für hier extra zusammengeschipselt.
    Kann man denn in reinem C RAII nutzen? In meiner neuen C++ Klasse habe ich per new im Konstuktor Speicher reserviert und im Destruktor mit delete[] wieder freigegeben, das ist doch RAII oder?

    Ein Vektor ist dann wohl doch eleganter.

    G hibbes



  • hibbes schrieb:

    Danke für die Hinweise, das C-Beispiel habe ich für hier extra zusammengeschipselt.
    Kann man denn in reinem C RAII nutzen? In meiner neuen C++ Klasse habe ich per new im Konstuktor Speicher reserviert und im Destruktor mit delete[] wieder freigegeben, das ist doch RAII oder?

    Ein Vektor ist dann wohl doch eleganter.

    G hibbes

    Wenn du in C programmierst, dann kannst du keine Klassen verwenden und hast auch keine Desktrutoren. Folglich kannst du RAII nicht nutzen.

    Ja, das ist soweit RAII, wenn du im Konstruktor alles bereitstellst und im Destruktor alles aufräumst. Praktisch solltest du aber noch den Zuweisungsoperator und Kopierkonstruktor einbeziehen.

    http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)



  • unskilled schrieb:

    hibbes schrieb:

    Mein Ziel ist es ein Array aus unsigned chars so schnell wie möglich auf 0 zu setzen.

    In welchem Kontext?

    unsigned char arr[X] = {};
    //bzw.
    std::tr1::array<unsigned char, X> arr;
    

    oder

    std::vector<unsigned char> arr(X);
    

    je nachdem gibt es eben verschiedene Methoden.

    std::fill kann man immer verwenden.

    für "nackte" arrays kann man sich auch "schöne" hilfs-makros machen

    #define ARRAY_SIZE(a) ((sizeof(a))/(sizeof((a)[0])))
    #define ARRAY_BEGIN(a) (&((a)[0]))
    #define ARRAY_END(a) (ARRAY_BEGIN(a) + ARRAY_SIZE(a))
    
    void foo()
    {
        int a[100];
        std::fill(ARRAY_BEGIN(a), ARRAY_END(a), 0);
    }
    


  • hustbaer schrieb:

    für "nackte" arrays kann man sich auch "schöne" hilfs-makros machen

    #define ARRAY_SIZE(a) ((sizeof(a))/(sizeof((a)[0])))
    #define ARRAY_BEGIN(a) (&((a)[0]))
    #define ARRAY_END(a) (ARRAY_BEGIN(a) + ARRAY_SIZE(a))
    
    void foo()
    {
        int a[100];
        std::fill(ARRAY_BEGIN(a), ARRAY_END(a), 0);
    }
    
    template<typename T*,size_t size>
    size_t size(T(&arr)[size]){
      return size;
    }
    template<typename T*,size_t size>
    size_t begin(T(&arr)[size]){
      return arr;
    }
    template<typename T*,size_t size>
    size_t end(T(&arr)[size]){
      return arr+size;
    }
    //und noch mit const
    


  • Dankeschön, das muss ich erstmal bei ner Runde Starcraft II verdauen. 😃



  • @ volkard:
    Dein Vorschlag ist zwar typsicher, aber nicht mehr compilezeit-konstant (für die Grösse könnte das vielleicht manchmal notwendig sein). Vielleicht aber in C++0x mit constexpr .

    Ich würde jedoch ohnehin gleich std::tr1::array benutzen, dann hat man auch ein STL-kompatibles Interface und nebenbei noch schöne Index- und Iteratorprüfungen im Debug-Modus.

    std::tr1::array<int, 100> a;
    std::fill(a.begin(), a.end(), 0);
    

    In diesem speziellen Falle ginge auch:

    std::tr1::array<int, 100> a = {};
    


  • Also ARRAY_SIZE würde ich immer als Makro anbieten (zumindest zusätzlich), genau wegen dem was Nexus schon erwähnt hat (Template nicht compile-time konstant).
    Mit C++0x wird sich das ändern, aber bis dahin...

    Bei begin()/end() kann man vermutlich auch gut ohne compile-time konstant auskommen.

    BTW: template<typename T*, size_t size> - also der * geht da IMO gar nicht 🙂 vertippt?



  • hustbaer schrieb:

    BTW: template<typename T*, size_t size> - also der * geht da IMO gar nicht 🙂 vertippt?

    Die letzten Tage stand nach T oft ein *. Da haben meine bösen Fingerchen das da automatisch getippt, ohne daß ich es mitgekriegt habe.



  • hustbaer schrieb:

    std::fill kann man immer verwenden.

    Dem wollte ich nicht widersprechen - nur denke ich noch immer, dass es unnötig ist...

    bb



  • Danke Danke bitte schließt den Fred, ich wollte doch nur ein Array mit 0 füllen 😃 Ihr seit ja wahnsinnig 😃 , was erhalte ich für Antworten wenn ich versuche einen Graphen zu implementieren, eine Diplomarbeit. 😃

    Ne mal im ernst, ich schätze das Forum hier sehr, da es eines der wenigen ist in dem man wirkliche Profis antrifft.

    Großes Lob an euch alle.
    G hibbes


Anmelden zum Antworten