2013-03-20 11 views
10

Obecnie pracuję nad rozwojem jądra systemu operacyjnego w C++ 11, a natknąłem się na pytanie, nie mogę znaleźć odpowiedzi na siebie.alignas specifier vs __attribute __ (wyrównane), C++ 11

Obecnie dopasowuję struktury stronicowania, używając atrybutów specyficznych dla kompilatora (np. Gcc's __attribute__(aligned)), ale chcę używać zamiast tego specyfikatora alignas C++ 11, na Clang ++ to nie jest problem, ponieważ chętnie akceptuje 4096 wyrównanie jako parametr alignas, jednak G ++ nie!

Więc przede wszystkim, co jest główną różnicę między alignas specifier i gcc __attribute__(aligned) oczywiście zarówno zapewnić dostosowanie do określonej wartości, jednak specifier alignas w gcc zdaje się mieć limit 128, natomiast atrybut wydaje się niemal nieograniczone, dlaczego tak jest?

Dlaczego nie można przekazać liczby całkowitej stałej do specyfikatora alignas?

+0

jaka wersja GCC? Jeśli wybierzesz GCC 4.8 tutaj: http://liveworkspace.org/code/1hxHGg$0, to działa dobrze. –

+0

@ R.MartinhoFernandes: 4,8; patrz http://liveworkspace.org/code/1kRIjz$0, z błędem 'ostrzeżenie: wymagane wyrównanie 4096 jest większe niż 128 [-Wattributes]' – Skeen

+1

Oh, jest w typie. To brzmi jak przydatna informacja do postawienia w pytaniu :) –

Odpowiedz

6

Wygląda na to, że ze stanu obsługi GCC obsługa wyrównania nie jest w pełni obsługiwana w gcc 4.7, ale jest przeznaczona dla gcc 4.8. alignas jest również wymieniony jako nowo obsługiwana funkcja z wersji 4.8 release page.

Również z alignment support proposal (3.11):

Fundamentalną wyrównanie jest reprezentowany przez wyrównanie mniejszej lub równej największej wyrównania obsługiwanym przez wdrożenie we wszystkich kontekstach, która jest równa alignof (STD :: max_align_t) (18.1).

Rozszerzone wyrównanie jest reprezentowane przez wyrównanie większe niż alignof (std :: max_align_t). Jest zdefiniowany w implementacji, czy obsługiwane są rozszerzone dopasowania i konteksty, w których są obsługiwane (7.1.6). Typ o rozszerzonym wymaganiu wyrównania jest typem z wyrównaniem.

I z tego samego dokumentu (7.1.6):

jeśli stała wyrażenie na dłuższy dostosowania i wdrożenia nie obsługuje tego wyrównania w kontekście deklaracji, program jest zniekształcony

To może być również część odpowiedzi. Nie mam obecnie dostępu do pełnego standardu, ktoś powinien być w stanie to potwierdzić.

Jeśli chodzi o różnicę między __attribute__(aligned) i alignas, nie sądzę, że są one semantycznie różne, ale jeden jest tylko rozszerzeniem kompilatora, podczas gdy drugi jest w pełni zdefiniowany przez standard.

Aby odpowiedzieć na to ostatnie pytanie, alignas jest zdefiniowana tylko dla:

alignas (constant-expression) 
alignas (type-id) 
+0

Otrzymuję, że jeden jest w standardzie, a drugi jest rozszerzenie kompilatora, ale dlaczego nie mają tego samego ograniczenia, ponieważ implementacja apperently byłoby takie samo? - Jaki byłby argument za nieobsługiwaniem stałych liczb całkowitych w standardzie, jako argumentem do alignas? – Skeen

+0

W rzeczywistości wydaje się, że działa również ze stałymi liczbami całkowitymi dla gcc-4.8. Obecny limit może być tylko kwestią wdrożenia GCC. Wątpię, aby implementacja była taka sama dla nazwanych specyfikatorów i rozszerzeń kompilatorów, mimo że jest to semantyka. To może być tymczasowe ograniczenie. – Thibaut

+1

Masz rację, wygląda na to, że działa (jest to '__attribute __ ((wyrównane (...))', które nie akceptuje stałej liczby całkowitej), mam nadzieję, że jest tymczasowe lub co najwyżej przełączalne na kompilatorze w Przyszłość: – Skeen