std::array als Klassenmember



  • Wenn meine Klasse ein std::array<int,6> arr_ als member hat und ich dieses mittels der Constructor Initializer List initialisiere,

    struct Foo{
    
    Foo() : arr_{1,2,3,4,5,6}{}
    
    std::array<int,6> arr_
    };
    

    ist das das array zuvor schon mit 6 integern default constructed worden?

    und gibt es bei std::array einen move-constructor bzw. move assignment operator?`auf ccp-reference steht unter ctor nur: implicitly defined...



  • Sewing schrieb:

    ist das das array zuvor schon mit 6 integern default constructed worden?

    Nein. Wenn du die initializer list verwendest, wird nur der von dir verwendete Konstruktur aufgerufen.

    Sewing schrieb:

    und gibt es bei std::array einen move-constructor bzw. move assignment operator?`auf ccp-reference steht unter ctor nur: implicitly defined...

    Ja, gibt es. Es muss dir allerdings klar sein, dass alle 6 Elemente des Arrays einzeln gemoved werden. Im Falle eines int-Array bringt dir das keinen Vorteil über den copy constructor/assignment operator. Wenn das Array aus komplexeren Typen besteht, sieht das wieder anders aus, trotzdem müssen auch dann jeweils 6 move-Operationen durchgeführt werden. Darin unterscheidet sich ein array von einem vector, letzterer kann immer in konstanter Zeit gemoved werden, unabhängig von der Anzahl der Elemente.



  • danke, das bedeutet aber dann auch, dass die init-list effizienter ist, als wenn ich eine Zuweisung im Ctor Rumpf machen würde ja?



  • Sewing schrieb:

    danke, das bedeutet aber dann auch, dass die init-list effizienter ist, als wenn ich eine Zuweisung im Ctor Rumpf machen würde ja?

    Im allgemeinen ist das effizienter, ja.
    Speziell hier würde es allerdings keinen Unterschied machen, was unter anderem daran liegt, dass der default constructor bei einem int-array die Elemente gar nicht initialisiert.



  • dachte die würden default initialisiert?

    Im allgemeinen mag ich std::arrays, wenn ich eine fixed size meiner collection habe. Alleine schon, weil ich mich dann nicht wie bei std::vector mit dem ambiguous syntax rumärgern muss

    struct Foo{

    std::vector<std::vector<int>> vec_{1}; // vec_ hat ein Element vom Typ std::vector<int> der default-initialized ist

    ...
    };

    weiterhin muss man bei std::vector reserves machen um die effizioent zu steigern, sobald die elementanzahl bei ctor aufruf bekannt ist



  • Sewing schrieb:

    dachte die würden default initialisiert?

    Standart schrieb:

    To default-initialize an object of type T means:
    — if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the
    initialization is ill-formed if T has no accessible default constructor);
    — if T is an array type, each element is default-initialized;
    — otherwise, no initialization is performed.



  • Sewing schrieb:

    weiterhin muss man bei std::vector reserves machen um die effizioent zu steigern, sobald die elementanzahl bei ctor aufruf bekannt ist

    Tja ... und was machst Du mit std::array, wenn bei Ctor-Aufruf die Elementanzahl unbekannt ist?


Anmelden zum Antworten