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.
aligned(4)
Anda mungkin tidak banyak yang perlu dikhawatirkan.Jawaban:
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:
sizeof(sSampleStruct)
akan menjadi 12 daripada 8. Karena bantalan struktur. Secara default, Di X86, struktur akan dimasukkan ke penyelarasan 4-byte:Kita dapat menggunakan
__attribute__((packed, aligned(X)))
untuk meminta bantalan berukuran (X) tertentu. X harus menjadi pangkat dua. Lihat di sinijadi 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
sumber
packed
Berarti itu akan menggunakan ruang sekecil mungkin untukstruct Ball
- yaitu akan menjejalkan bidang bersama-sama tanpa bantalanaligned
berarti masingstruct Ball
- masing akan mulai pada batas 4 byte - yaitu untuk setiapstruct Ball
, alamatnya dapat dibagi 4Ini adalah ekstensi GCC, bukan bagian dari standar C mana pun.
sumber
Atribut tersebut
packed
berarti bahwa kompilator tidak akan menambahkan padding di antara fieldstruct
. 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.sumber