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.

 93
Author: Mawg, 2012-08-02

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)
 117
Author: Jeyaram,
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 dla struct Ball - tzn. będzie wypełniać pola razem bez wypełniania
  • aligned oznacza, że każdy struct Ball rozpocznie się na granicy 4 bajtów - tzn. dla dowolnego struct Ball, jego adres może być podzielony przez 4

Są to rozszerzenia GCC, nie są częścią żadnego standardu C.

 66
Author: cnicutar,
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.

 11
Author: Julian Stecklina,
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