Speicher-Allokation



  • Ich möchte Code für verschiedene Architekturen optimieren und dabei eventuell auch SIMD-Funktionalität nutzen.
    Nun ist es so, dass viele dieser Funktionen von bestimmter Speicher-Ausrichtung profitieren.

    Nun habe ich in meinem Code öfters SPeicher allokation mittels new.
    Wie kann ich auf effiziente Art und Weise einstellen, wie ich den Speciher beschaffen möchte - so dass ich das auch noch später entscheiden kann ?

    Eine SPeicher-Allokationsklasse?



  • Nein, das muss zur Compilezeit feststehen.



  • Ein Allokator wäre eine Möglichkeit für STL-Container.

    Wenn du nur eine Abstraktion von new und delete brauchst, schreib dir entsprechende Funktionen:

    template <typename T, typename... Args>
    T* New(Args&& args)
    {
        return new T(std::forward<Args...>(args));
    }
    
    template <typename T>
    void Delete(T* pointer)
    {
        delete pointer;
    }
    
    int* ptr = New<int>(3);
    Delete(ptr);
    

    Denk auch daran, so selten wie möglich diese rohen Mechanismen zu verwenden und stattdessen RAII in der Form von Smart-Pointers einzusetzen. Das macht den Code einfacher und weniger fehleranfällig (und bei std::unique_ptr auch nicht langsamer).


  • Mod

    Nun habe ich in meinem Code öfters SPeicher allokation mittels new.

    Ist hoffentlich gerechtfertigt. Wie Nexus bereits angesprochen hat, sollte man das nicht explizit schreiben und kapseln.

    Nun ist es so, dass viele dieser Funktionen von bestimmter Speicher-Ausrichtung profitieren.

    Seit C++11 kann man Speicher ausgerichtet besorgen, mittels alignas:

    template< typename T, std::size_t Alignment = alignof(T) >
    struct aligned_object
    {
    	alignas(Alignment) T object;
    
    	// ggf. forwarding ctor
    };
    

    Du schreibst new aligned_object<MeineStruct, 32>{...}; .
    (Ungetestet)


Anmelden zum Antworten