Jest to język C. Napisano, że:
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
//float3 color;
float size;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;
Proszę, powiedz mi, jakie jest jego znaczenie i jak używać tego słowa kluczowego.
aligned(4)
prawdopodobnie nie masz się czym martwić.Odpowiedzi:
Zanim odpowiem, chciałbym podać kilka danych z Wiki
Wyrównanie struktury danych to sposób organizowania danych i uzyskiwania do nich dostępu w pamięci komputera. Składa się z dwóch oddzielnych, ale powiązanych zagadnień: wyrównania danych i wypełnienia struktury danych .
Kiedy nowoczesny komputer czyta lub zapisuje na adres pamięci, robi to w fragmentach wielkości słowa (np. 4-bajtowe fragmenty w systemie 32-bitowym). Dopasowanie danych oznacza umieszczenie danych w przesunięciu pamięci równym pewnej wielokrotności rozmiaru słowa, co zwiększa wydajność systemu ze względu na sposób, w jaki procesor obsługuje pamięć.
Aby wyrównać dane, może być konieczne wstawienie kilku bezsensownych bajtów między końcem ostatniej struktury danych a początkiem następnej, czyli wypełnienia struktury danych .
gcc zapewnia funkcję wyłączania dopełniania struktury. tj. aby w niektórych przypadkach uniknąć tych bezsensownych bajtów. Rozważ następującą strukturę:
sizeof(sSampleStruct)
będzie 12 zamiast 8. Z powodu wypełnienia struktury. Domyślnie w X86 struktury będą dopełniane do 4-bajtowego wyrównania:Możemy użyć,
__attribute__((packed, aligned(X)))
aby nalegać na wypełnienie o określonym rozmiarze (X). X powinno być potęgą dwójki. Zobacz tutajwięc wyżej określony atrybut gcc nie pozwala na wypełnienie struktury. więc rozmiar będzie wynosił 8 bajtów.
Jeśli chcesz zrobić to samo dla wszystkich struktur, po prostu możemy przesunąć wartość wyrównania do stosu za pomocą
#pragma
źródło
packed
oznacza, że wykorzysta jak najmniejszą możliwą przestrzeństruct Ball
- tj. będzie upychać pola razem bez wypełnieniaaligned
oznacza, że każdystruct Ball
będzie zaczynał się od 4-bajtowej granicy - czyli dla każdegostruct Ball
, jego adres można podzielić przez 4To są rozszerzenia GCC, nie będące częścią żadnego standardu C.
źródło
Atrybut
packed
oznacza, że kompilator nie doda wypełnienia między polami plikustruct
. Wypełnienie jest zwykle używane w celu wyrównania pól do ich naturalnego rozmiaru, ponieważ niektóre architektury nakładają kary za niewyrównany dostęp lub w ogóle go nie zezwalają.aligned(4)
oznacza, że struktura powinna być wyrównana do adresu, który jest podzielny przez 4.źródło