أيهما أكثر كفاءة؟

طرحت سؤال في تويتر حول أي من التركيبين (Two structs) في لغة C أكثر كفاءة من ناحية استخدام المساحة (Space).

السؤال هو لديك التركيبين A و B كالتالي:

struct A{
int x;
char z;
short y;
char w;
};

struct B{
int x;
char z;
char w;
short y;
};

أي منهما هو أكثر كفاءة من ناحية استخدام الذاكرة؟ قد يظهر للشخص للوهلة الأولى أنهما متطابقين فكلهما يستخدم متغير من نوع int (٣٢ بت) واثنين من نوع char (٨ بت) وواحد من نوع short (١٦ بت) فلذلك كل منهما يستخدم 8 بايت (٦٤ بت) في الذاكرة. ولكن هذا غير صحيح، جرب بنفسك هنا.

لماذا A يستهلك 12 بايت بينما B فقط 8 بايت؟

السبب له علاقة بكيفية قيام المترجم Complier بمحاذاة (Alignment) للبيانات في الذاكرة والحشو  (padding)، باختصار، ما يحصل في الذاكرة، على افتراض أن كل كلمة word تتكون من ٣٢ بت هو التالي بالنسبة لA:

A.x A.x A.x A.x
A.z *** A.y A.y
A.w *** *** ***

فالمجموع هو 3 كلمات words أو 12 بايت، بينما بالنسبة بالنسبة لB:

B.x B.x B.x B.x
B.z B.w B.y B.y

ما حصل هو أن المترجم (الكمبايلر) يقوم بإضافة حشو في الأماكن الفارغة الغير مستخدمة بحيث يبدأ كل متغير variable من رقم في الذاكرة من مضاعفات حجمه، فمثلا المتغيرات من نوع short حجمها 16 بت (2 بايت)، لذلك لا يسمح المترجم بأن يبدأ بعنوان من غير مضاعفات ال2.
وعلى ذلك، فإن الكمبايلر ما زال غبيًا بحيث لا يستطيع أن يضع تعريف المتغيرات في ترتيب مثالي لإستخدام الذاكرة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *