شاید خیلی از دوستان بهصورت سرسری از این موضوع گذشتهباشند، و یا شایدم اصلاً اطلاعی درموردش نداشتهباشند.
این Struct رو در نظر داشتهباشید :
struct foo{ char ch; int in; };
مسلماً در نظر دارید که الآن متغیر char به اندازه یکبایت، و متغیر int به اندازه چهاربایت باید و نهایت پنج بایت باید فضا اشغال کند. خب بیاید یک تست بکنیم ببینم آیا واقعاً درست است ؟
#include <stdio.h> int main (){ printf("%ld\n", sizeof(struct foo)); return 0; }
و درنهایت :
$ gcc-9 struct.c -o out ; ./out $ 8
خب ! ما انتظار ۵ بایت داشتیم، ولی چرا شد ۸ ؟. این اتفاق برای دسترسی سریعتر به مقادیر در حافظه میافته و بش Structure Padding گفته میشود. بدینصورت که اندازه نوع `int` چهاربایت هست و اندازه نوع `char` یکبایت. کامپایلر یک چهاربایتی برای `int` در نظر میگیرد و یکچهاربایتی نیز برای `char` به این کد توجه کنید :
#include <stdio.h> struct foo{ char ch; char ch2; char ch3; char ch4; int in; }; int main (){ printf("%ld\n", sizeof(struct foo)); return 0; }
و حالا بیاید خروجی رو ببینیم :
$ gcc-9 struct.c -o out ; ./out $ 8
:) و همینطوری که گفتیم، کامپایلر برای نوع `char` هم درحالی که یکبایت نیاز داره، چهاربایت میگیره.
اگر به دنبال کردن این داستان علاقه دارید، پیشنهاد میکنم که این مقاله آقایاریکریموند رو بخونید.