Apa arti dari "__attribute __ ((dikemas, sejajar (4)))"


122

Itu adalah bahasa C. Ada tertulis bahwa:

typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

Tolong beritahu saya apa artinya itu, dan bagaimana menggunakan kata kunci ini.


4
Ini adalah "atribut tipe" .. (Saya menemukan ini dengan "atribut C dikemas" di Google. Tentunya orang lain setidaknya bisa berbuat sebaik itu!)

1
Lihat pertanyaan ini - meskipun dengan aligned(4)Anda mungkin tidak banyak yang perlu dikhawatirkan.
Keith Thompson

Jawaban:


157

Sebelum menjawab, saya ingin memberikan beberapa data dari Wiki


Penyelarasan struktur data adalah cara data disusun dan diakses dalam memori komputer. Ini terdiri dari dua masalah yang terpisah namun terkait: penyelarasan data dan bantalan struktur data .

Ketika komputer modern membaca dari atau menulis ke alamat memori, komputer akan melakukan ini dalam potongan berukuran word (misalnya potongan 4 byte pada sistem 32-bit). Penyelarasan data berarti meletakkan data pada offset memori yang sama dengan beberapa ukuran kata, yang meningkatkan kinerja sistem karena cara CPU menangani memori.

Untuk menyelaraskan data, mungkin perlu untuk memasukkan beberapa byte yang tidak berarti antara akhir dari struktur data terakhir dan awal dari yang berikutnya, yaitu bantalan struktur data .


gcc menyediakan fungsionalitas untuk menonaktifkan padding struktur. yaitu untuk menghindari byte yang tidak berarti ini dalam beberapa kasus. Pertimbangkan struktur berikut:

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

sizeof(sSampleStruct)akan menjadi 12 daripada 8. Karena bantalan struktur. Secara default, Di X86, struktur akan dimasukkan ke penyelarasan 4-byte:

typedef struct
{
     char Data1;
     //3-Bytes Added here.
     int Data2;
     unsigned short Data3;
     char Data4;
     //1-byte Added here.

}sSampleStruct;

Kita dapat menggunakan __attribute__((packed, aligned(X)))untuk meminta bantalan berukuran (X) tertentu. X harus menjadi pangkat dua. Lihat di sini

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}__attribute__((packed, aligned(1))) sSampleStruct;  

jadi atribut gcc yang ditentukan di atas tidak mengizinkan bantalan struktur. jadi ukurannya akan menjadi 8 byte.

Jika Anda ingin melakukan hal yang sama untuk semua struktur, cukup kita dapat mendorong nilai alignment ke stack menggunakan #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

6
Jika memori menyimpan data dalam potongan 4 byte lalu mengapa tidak menambahkan 2 padding byte ke unsigned short (panjangnya 2 byte)? atau kompiler hanya menambahkan padding byte ke 1 dan anggota terakhir struktur? bisakah Anda menjelaskannya.
Pengguna

5
@ Pengguna Tlg lihat ini juga. Jika Anda masih belum jelas,
silakan

Siapa pun yang mengatakan byte padding ini tidak berarti tidak tahu bahwa akses data yang tidak selaras adalah keanehan arsitektur x86. Byte ini diperlukan untuk menghindari pengecualian saat prosesor mencoba memuat - katakanlah sebuah integer - data yang melintasi batas kesejajaran alaminya.
Tanveer Badar

86
  • packedBerarti itu akan menggunakan ruang sekecil mungkin untuk struct Ball- yaitu akan menjejalkan bidang bersama-sama tanpa bantalan
  • alignedberarti masing struct Ball- masing akan mulai pada batas 4 byte - yaitu untuk setiap struct Ball, alamatnya dapat dibagi 4

Ini adalah ekstensi GCC, bukan bagian dari standar C mana pun.


17

Atribut tersebut packedberarti bahwa kompilator tidak akan menambahkan padding di antara field struct. Padding biasanya digunakan untuk membuat bidang sejajar dengan ukuran aslinya, karena beberapa arsitektur memberlakukan penalti untuk akses yang tidak selaras atau tidak mengizinkannya sama sekali.

aligned(4) berarti struct harus diratakan ke alamat yang habis dibagi 4.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.