Sabtu, Juni 27, 2020

makro offset pada bahasa C

Diketahui bahwa elemen pada struktur akan disimpan dalam urutan sekuensial pada deklarasinya. Bagaimana cara untuk mengekstrak perpindahan elemen dalam suatu struktur? Hal ini dapat dilakukan dengan menggunakan makro offset. Biasanya dilakukan pemanggilan struktur atau tipe union (atau class dengan kontruktor trivial) sebagai tipe plain old data (POD), yang akan digunakan untuk tipe data aggregasi lainnya. Makro non-standar berikut dapat digunakan untuk mendapatkan perpindahan elemen dalam byte dari alamat dasar variabel struktur. 

#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))

Nol di casted ke tipe dari struktur dan alamat elemen yang diperlukan akan diakses, yang akan di casted ke size_t. Sepertinya halnya standar size_t dari tipe unsigned int. Ekspresi keseluruhan menghasilkan jumlah byte yang setelahnya ditempatkan elemen dalam struktur.

Sebagai contoh, kode berikut mengembalikan 16 byte (padding dianggap pada mesin adalah 32 bit) sebagai perpindahan variabel karakter c dalam struktur POD.


Pada kode program tersebut, nilai ekspresi akan mengembalikan pemindahan dari elemen c pada struktur PodType.

OFFSETOF(PodType, c);

Setelah tahap preprosesing makro akan berkembang menjadi 

((size_t)&(((PodType *)0)->c)) 

Karena dipertimbangkan 0 sebagai alamat variabel struktur, c akan ditempatkan setelah 16 byte dari alamat basisnya yaitu 0x00 dan 0x10. Menerapkan & pada elemen struktur (dalam hal ini bahasa c) mengembalikan alamat elemen 0x10. Casting alamat ke int (size_t) hasil unsigned dalam jumlah byte elemen ditempatkan dalam struktur.

note: jadi dapat dipertimbangkan bahwa alamat operator & adalah redundant. Tanpa alamat operator pada makro, kode de-referensi pada sktruktur elemen akan diganti alamat NULL. Hal ini akan menyebabkan pengecualian pelanggaran akses pada saat runtime.





Related Posts

makro offset pada bahasa C
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "