Co oznacza " atrybut ((spakowany, wyrównany (4))) "
Jest C language.It jest napisane, ż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ę mi powiedzieć, co to znaczy i jak używać tego słowa kluczowego.
3 answers
Zanim odpowiem, chciałbym dać ci trochę danych z Wiki
Wyrównanie Struktury Danych jest sposobem, w jaki dane są ułożone i dostępne w pamięci komputera. Składa się on z dwóch oddzielnych, ale powiązanych ze sobą zagadnień: wyrównanie danych i wypełnianie struktury danych.
Kiedy nowoczesny komputer odczytuje lub zapisuje adres pamięci, zrobi to w kawałkach o rozmiarze słowa (np. 4 bajtowe kawałki w systemie 32-bitowym). wyrównanie danych środki 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 pewnych bezsensownych bajtów między końcem ostatniej struktury danych a początkiem następnej, czyli wypełnianie struktury danych.
Gcc zapewnia możliwość uniknięcia wypełnienia struktury. np. aby uniknąć tych bezsensownych bajtów w niektórych przypadkach. Rozważ following structure
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
będzie 12 zamiast 8. Ze względu na wyściółkę struktury. Domyślnie, w X86, struktury będą wyściełane do wyrównania 4-bajtowego.
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Możemy użyć __attribute__((packed, aligned(X)))
, aby nalegać na konkretną (x) wyściółkę. X powinno być potęgą dwóch. Zobacz tutaj
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
Tak więc powyższy atrybut gcc nie pozwala na wypełnienie struktury. więc rozmiar będzie 8 bajtów.
Jeśli chcesz zrobić to samo dla wszystkich struktur, po prostu możemy przesuń wartość wyrównania do stosu za pomocą #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:56
-
packed
oznacza, że użyje najmniejszej możliwej przestrzeni dlastruct Ball
- tzn. będzie wypełniać pola razem bez wypełniania -
aligned
oznacza, że każdystruct Ball
rozpocznie się na granicy 4 bajtów - tzn. dla dowolnegostruct Ball
, jego adres może być podzielony przez 4
Są to rozszerzenia GCC, nie są częścią żadnego standardu C.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 15:52:23
Atrybut packed
oznacza, że kompilator nie doda wypełnienia między polami struct
. Padding jest zwykle używany do wyrównywania pól do ich naturalnej wielkości, ponieważ niektóre architektury nakładają kary za dostęp bez wyrównania lub nie zezwalają na to w ogóle.
aligned(4)
oznacza, że struktura powinna być wyrównana do adresu podzielnego przez 4.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 16:14:48