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?
-
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
::typevergessen.
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::typemeinst:struct alignas(16) empty{};hat bei mir Grösse 16.
Wenn das mit::type: Der Storage hat dann die Grösse 128.
-
Meinte ::type
Es wäre allerdings eher überrachend, falls aligned_storage keine leere Klasse sein sollte.elias strohratsch schrieb:
Wenn du das ohne
::typemeinst: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
::typemeinst: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?