Dlaczego i jak jest używana __attribute__
w programach GNU C?__attribute__ w GNU C
Odpowiedz
Jednym z zastosowań jest wymuszenie wyrównania pamięci na zmiennych i elementach konstrukcyjnych. Na przykład
float vect[4] __attribute__((aligned(16)));
zapewni, że vect
zostaną umieszczone na granicy 16 bajtów pamięci. Nie wiem, czy to jest gcc-ism lub bardziej ogólnie stosowane.
Kompilator będzie zazwyczaj dostosowywał tylko vect
na granicy 4 bajtów. Dzięki 16-bajtowemu wyrównaniu można go używać bezpośrednio z instrukcjami ładowania SIMD, gdzie można go załadować do 128-bitowych rejestrów, które umożliwiają dodawanie, odejmowanie, dotowanie produktów i wszelkiego rodzaju operacje wektorowe.
Czasem potrzebne jest wyrównanie, aby struktura mogła zostać bezpośrednio nałożona na rejestry sprzętowe odwzorowane w pamięci. Lub musi być wyrównany, aby sprzęt mógł do niego pisać bezpośrednio wykorzystując mechanizm bezpośredniego dostępu do pamięci (DMA). Atrybuty
Dlaczego jest on używany w programach C? Aby ograniczyć ich przenośność.
Zaczyna się od podwójnego podkreślenia, więc znajduje się w przestrzeni nazw implementatora - nie jest to coś zdefiniowane przez standard językowy, a każdy sprzedawca kompilatora może go dowolnie wykorzystywać w dowolnym celu.
Edytuj: Dlaczego jest używany w programach GNU C? Zobacz inne odpowiedzi, które rozwiązują ten problem.
Do jakich kompilatorów zgodnych z GCC i GCC należy używać __attribute__
większość innych kompilatorów używa dyrektyw #pragma
.
myślę rozwiązanie GCC jest lepsza od wymaganego zachowania nierozpoznanym #pragma
jest ją ignorować, natomiast w przypadku korzystania z kompilatora, który nie rozumie specyfikację __attribute__
, nie będzie skompilować - co jest generalnie lepszy, ponieważ was następnie Wiesz, co musisz portować.
Specyfikacje atrybutów są używane do określania aspektów typów, danych i funkcji, takich jak przechowywanie i wyrównanie, których nie można określić za pomocą C. Często są one specyficzne dla celu, w większości są nieprzenośne, na pewno między kompilatorami, a często między celami . Unikaj ich użycia, chyba że jest to bezwzględnie konieczne do prawidłowego funkcjonowania kodu.
Chociaż te linki są przydatne, ta odpowiedź sama w sobie nie dostarcza żadnych informacji. –