Grösse von Array aus aligned_storages



  • Wieso gibt folgendes Programm einmal "1" und zwei mal "3" aus?

    int main()
    {
      typedef std::aligned_storage<1, 128> type;
      typedef type array[3];
      struct strct {type a;type b;type c;};
      std::cout << sizeof(type ) << '\n';
      std::cout << sizeof(array) << '\n';
      std::cout << sizeof(strct) << '\n';
    }
    


  • Weil du einmal ein Objekt und zweimal 3 Objekte hast? 😕

    Meinst du vielleicht std::aligned_storage::type ?


  • Mod

    elias strohratsch schrieb:

    Wieso gibt folgendes Programm einmal "1" und zwei mal "3" aus?

    int main()
    {
      typedef std::aligned_storage<1, 128> type;
      typedef type array[3];
      struct strct {type a;type b;type c;};
      std::cout << sizeof(type ) << '\n';
      std::cout << sizeof(array) << '\n';
      std::cout << sizeof(strct) << '\n';
    }
    

    1. Sofern deine Implementation keine Typen mit 128-Byte-Alignment unterstützt, ist das undefiniert.
    2. std::aligned_storage<1, n> sollte sowie immer die Größe 1 haben.



  • @Nexus: Peinlich, ich habe wirklich das ::type vergessen. 😃

    camper schrieb:

    1. Sofern deine Implementation keine Typen mit 128-Byte-Alignment unterstützt, ist das undefiniert.

    ?
    Ich dachte alle Typen, deren Alignment durch 128 teilbar sind, müssen sich darin speichern lassen, was in diesem Fall alle wären.

    camper schrieb:

    2. std::aligned_storage<1, n> sollte sowie immer die Größe 1 haben.

    ?
    Wenn du das ohne ::type meinst: struct alignas(16) empty{}; hat bei mir Grösse 16.
    Wenn das mit ::type : Der Storage hat dann die Grösse 128.


  • Mod

    Meinte ::type
    Es wäre allerdings eher überrachend, falls aligned_storage keine leere Klasse sein sollte.

    elias strohratsch schrieb:

    Wenn du das ohne ::type meinst: struct alignas(16) empty{}; hat bei mir Grösse 16.

    Das ist allerdings nicht zwingend identisch mit dem, was aligned_storage<1,16>::type liefert.

    n3337 schrieb:

    Template
    template <std::size_t Len, std::size_t Align = default-alignment > struct aligned_storage;

    Condition
    Len shall not be zero. Align shall be equal to alignof(T) for some type T or to default-alignment.

    Comments
    The value of default-alignment shall be the most stringent alignment requirement for any C++ object type whose size is no greater than Len (3.9).
    The member typedef type shall be a POD type suitable for use as uninitialized storage for any object whose size is at most Len and whose alignment is a divisor of Align.

    Habe falsch gelesen. Es ist nicht garantiert, das sizeof(std::aligned_storage<1, 128>::type) 1 ist, eine vernünftige Implementierung sollte das allerdings m.M.n. so machen (da für alle Typen gilt: alignof(T)<=sizeof(T))

    Und falls deine Implementierung keine 128-Byte-aligned Typen kennt, kannst du unmöglich die angegebene Bedingung erfüllen.



  • camper schrieb:

    elias strohratsch schrieb:

    Wenn du das ohne ::type meinst: struct alignas(16) empty{}; hat bei mir Grösse 16.

    Das ist allerdings nicht zwingend identisch mit dem, was aligned_storage<1,16>::type liefert.

    Es bezieht sich darauf, dass std::aligned_storage<1, n> auch als leere Klasse grösser als 1 sein darf.

    camper schrieb:

    Es ist nicht garantiert, das sizeof(std::aligned_storage<1, 128>::type) 1 ist, eine vernünftige Implementierung sollte das allerdings m.M.n. so machen (da für alle Typen gilt: alignof(T)<=sizeof(T))

    Ich hatte gehofft, dass das passiert, weil dann die Ausgabe meines Beispielprogramms interessant geworden wäre. Leider scheint bei GCC und bei Clang im Fall von aligned_storage immer Gleicheit zu gelten. Kannst du mir das vielleicht sagen?


Anmelden zum Antworten