2015-11-11 44 views
8

W języku C, czy istnieje sposób na wyrównanie (np. Więcej wyrównania niż można wywnioskować z systemu typów) na stosie?Odpowiednik std :: aligned_storage <> w C?

Dla zmiennych w dynamicznie przydzielanej pamięci możemy zawsze wyrównać ręcznie, jeśli wszystko inne zawiedzie, ale co można zrobić dla zmiennych w automatycznie przydzielonej pamięci?

Domyślam się, że możliwe jest użycie char[size + alignment - 1], a następnie zawsze używaj manipulacji bitem, aby uzyskać dostęp do zmiennej, ale wydaje się to nieco "cieńsze niż to konieczne" (har har;)).

+0

Czy próbowałeś _Alignas specifier? – this

+0

@ this ups, powinienem był wspomnieć, nie C11, dzięki – Praxeolitic

+0

Dlaczego zaakceptowałeś drugą odpowiedź, jeśli C11 nie było opcją? :-( – this

Odpowiedz

5

W C2011, istnieją _Alignas i _Alignof słowa kluczowe, nagłówek <stdalign.h> co sprawia, że ​​ich użycie nieco mniej brzydki, a typ max_align_t (który jest w <stddef.h>). Można na przykład napisać

double _Alignas(4*_Alignof(double)) dvector[16]; 

zwrócić tablicę 16 double ilości dostosowane do 4x zwykłe wyrównanie double, ponieważ może być konieczne do zastosowania z procesorem specyficznych instrukcji wektorowych. Nie gwarantuje się, że działa na wszystkich implementacjach, ale jeśli to nie zadziała, gwarantuje to błąd podczas kompilacji.

Przed C2011 nie było standardowego sposobu na wykonanie , ale wiele kompilatorów miało rozszerzenia o podobnej funkcjonalności, np. Konstrukcja GCC __attribute__ (aligned).

5

Cóż za związki przychodzą na myśl.

union This 
{ 
    int integer; 
    align_type alignment; 
} ; 

Nie ma dopełnienia przed członkami w związkach. Więc jeśli zadeklarujesz automatyczną zmienną union This, to ona i wszystkie jej elementy powinny być wyrównane tak samo jak wyrównanie elementu o najwyższym wyrównaniu.