Penggunaan Memori Efisien dengan Bit Field C
Misalkan program C Anda memiliki sejumlah variabel TRUE/FALSE yang dikelompokkan dalam struktur bernama status, sebagai berikut −
struct { unsigned int widthValidated; unsigned int heightValidated; } status; Struktur ini membutuhkan 8 byte ruang memori, tetapi sebenarnya kita akan menyimpan nilai 0 atau 1 pada setiap variabel. Bahasa pemrograman C menawarkan cara yang lebih baik untuk memanfaatkan ruang memori dalam situasi seperti ini.
Jika Anda menggunakan variabel semacam itu di dalam struktur, Anda dapat menentukan lebar variabel yang memberitahu kompiler C bahwa Anda akan menggunakan sejumlah byte tersebut. Misalnya, struktur di atas dapat ditulis ulang sebagai berikut −
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status; Struktur di atas membutuhkan 4 byte ruang memori untuk variabel status, tetapi hanya 2 bit yang akan digunakan untuk menyimpan nilai.
Jika Anda akan menggunakan hingga 32 variabel, masing-masing dengan lebar 1 bit, maka struktur status tetap akan menggunakan 4 byte. Namun begitu Anda memiliki 33 variabel, itu akan mengalokasikan slot memori berikutnya dan mulai menggunakan 8 byte. Mari kita periksa contoh berikut untuk memahami konsep ini −
Live Demo
#include <stdio.h> #include <string.h> /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0; } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Ukuran memori yang diisi oleh status1 : 8 Ukuran memori yang diisi oleh status2 : 4
Deklarasi Bit Field
Deklarasi sebuah bit-field memiliki bentuk berikut di dalam struktur −
struct { type [member_name] : width ; }; Tabel berikut menjelaskan elemen-elemen variabel dari sebuah bit field −
| Sr.No. | Elemen & Deskripsi |
| 1 | type Tipe integer yang menentukan bagaimana nilai bit-field ditafsirkan. Tipe dapat berupa int, signed int, atau unsigned int. |
| 2 | member_name Nama dari bit-field. |
| 3 | width Jumlah bit dalam bit-field. Lebar harus lebih kecil atau sama dengan lebar bit dari tipe yang ditentukan. |
Variabel yang didefinisikan dengan lebar yang telah ditentukan disebut bit fields. Sebuah bit field dapat menampung lebih dari satu bit; misalnya, jika Anda perlu variabel untuk menyimpan nilai dari 0 hingga 7, maka Anda dapat mendefinisikan bit field dengan lebar 3 bit sebagai berikut −
struct { unsigned int age : 3; } Age; Definisi struktur di atas memberitahu kompiler C bahwa variabel age akan hanya menggunakan 3 bit untuk menyimpan nilai. Jika Anda mencoba menggunakan lebih dari 3 bit, maka kompiler tidak akan mengizinkannya. Mari kita coba contoh berikut −
Live Demo
#include <stdio.h> #include <string.h> struct { unsigned int age : 3; } Age; int main( ) { Age.age = 4; printf( "Sizeof( Age ) : %d\n", sizeof(Age) ); printf( "Age.age : %d\n", Age.age ); Age.age = 7; printf( "Age.age : %d\n", Age.age ); Age.age = 8; printf( "Age.age : %d\n", Age.age ); return 0; } Ketika kode di atas dikompilasi, akan muncul peringatan, dan saat dieksekusi, hasilnya adalah sebagai berikut −
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0