افترض أن برنامج C الخاص بك يحتوي على عدد من المتغيرات TRUE / FALSE مجمعة في بنية تسمى الحالة ، على النحو التالي -
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
تتطلب هذه البنية 8 بايت من مساحة الذاكرة ولكن في الواقع ، سنقوم بتخزين 0 أو 1 في كل من المتغيرات. توفر لغة البرمجة C طريقة أفضل للاستفادة من مساحة الذاكرة في مثل هذه المواقف.
إذا كنت تستخدم مثل هذه المتغيرات داخل بنية ، فيمكنك تحديد عرض المتغير الذي يخبر مترجم C أنك ستستخدم هذا العدد من البايتات فقط. على سبيل المثال ، يمكن إعادة كتابة الهيكل أعلاه على النحو التالي -
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
تتطلب البنية أعلاه 4 بايت من مساحة الذاكرة لمتغير الحالة ، ولكن سيتم استخدام 2 بت فقط لتخزين القيم.
إذا كنت ستستخدم ما يصل إلى 32 متغيرًا كل واحد بعرض 1 بت ، فستستخدم بنية الحالة أيضًا 4 بايت. ومع ذلك ، بمجرد أن يكون لديك 33 متغيرًا ، فسوف تخصص الفتحة التالية من الذاكرة وستبدأ باستخدام 8 بايت. دعونا نتحقق من المثال التالي لفهم المفهوم -
#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; }
عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
إعلان حقل بت
يحتوي إعلان حقل البت على الشكل التالي داخل بنية -
struct { type [member_name] : width ; };
يصف الجدول التالي العناصر المتغيرة لحقل بت -
الأب رقم. | العنصر والوصف |
---|---|
1 | نوع نوع عدد صحيح يحدد كيفية تفسير قيمة حقل البت. قد يكون النوع عدد صحيح أو عدد صحيح أو عدد صحيح بدون توقيع. |
2 | اسم عضو اسم حقل البت. |
3 | عرض عدد البتات في حقل البت. يجب أن يكون العرض أقل من عرض البت للنوع المحدد أو مساويًا له. |
المتغيرات المعرفة بعرض محدد مسبقا تسمى حقول بت . يمكن أن يحتوي حقل البت على أكثر من بت واحد ؛ على سبيل المثال ، إذا كنت بحاجة إلى متغير لتخزين قيمة من 0 إلى 7 ، فيمكنك تحديد حقل بت بعرض 3 بتات على النحو التالي -
struct { unsigned int age : 3; } Age;
يوجه تعريف البنية أعلاه مترجم C إلى أن متغير العمر سيستخدم 3 بتات فقط لتخزين القيمة. إذا حاولت استخدام أكثر من 3 بتات ، فلن تسمح لك بذلك. دعونا نجرب المثال التالي -
#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; }
عندما يتم تجميع الكود أعلاه ، سيتم تجميعه مع تحذير وعندما يتم تنفيذه ، فإنه ينتج النتيجة التالية -
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0
تعليقات
إرسال تعليق