2009-09-22 9 views

Odpowiedz

28

GCC: atrybuty

  • funkcyjne opisane here
  • zmienne atrybuty opisane here
  • Rodzaj atrybuty opisane here
+4

Chociaż te linki są przydatne, ta odpowiedź sama w sobie nie dostarcza żadnych informacji. –

9

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

-2

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.

+4

Uh, nie sądzę, że jest używany specjalnie w celu zwiększenia możliwości kaskadowania. – GManNickG

+1

@mpl Więc nie używaj go. Atrybuty pozwalają wycisnąć więcej ze sprzętu, ale nie jesteś do tego zmuszony. – qrdl

+0

@GMan: kiedy jest używany, jest to jeden z efektów, jaki będzie miał. – mlp

16

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.