تو این آموزش می خوایم یک گریزی به معماری کامپیوتر و برنامه نویسی داشته باشیم و ببنیم تو ذخیره سازی داده ها در Ram چه اتفاقاتی میفته!؟ (البته خیلی وقت نیست من خودم با این داستان آشنا شدم برای همین گفتم شاید برای شما هم جالب باشه)
حالا وقتی ما از این structure یک نمونه ایجاد کنیم و با دستور Sizeof بخوایم اندازه این structure بدست بیاریم انتظار داریم که به ما 8 را برگردونه ، به این دلیل که هر کارکتر 1 بایت فضا اشغال میکنه و نوع int 4 بایت که مجوعا چهار کارکتر داریم و 1 نوع int که میشه 8 بایت ، وقتی از دستور زیر استفاده می کنیم :
کد:
//init First structure:
f_student_strcut f_test;
cout << sizeof(f_test) << endl;
برنامه مطابق انتظار به ما 8 را بر میگردونه و چیز عجیبی نمیبینیم!
حالا بزارید یک structure جدید تعریف کنیم ، این بار به این شکل :
کد:
struct s_student_struct
{
char a;
int b;
char c;
};
حالا دوباره یک نمونه از این structure ایجاد میکنیم و با دستور Sizeof اندازه این structure را به دست میاریم :
کد:
//init Seconde Structure:
s_student_struct s_test;
cout << sizeof(s_test) << endl;
ما انتظار داریم برنامه به ما 6 را نشان بده ، اما برخلاف انتظار ما عدد 12 را نشان میده !! آیا ما اشتباه کردیم !؟ یا کامپایلر !؟ هیچکدام ، پس چه اتفاقی افتاد !؟
در معماری کامپیوتر خوانده بودیم هر معماری کامپیوتر برای ذخیره داده ها روی رم از واحد خاصی از اندازه استفاده میکنه که ما به این واحد گفته بودیم Word (کلمه) ، وقتی Structure به شکل اول تعریف میکنیم کامپیوتری که هر کلمه اش 4 بایت هست برای ذخیره سازی مشکلی نداره ؛ و اونها رو به شکل زیر روی رم مینویسه : struct_1.png اما در structure برای اینکه کامپیوتر زمان خواندن دچار مشکل نشه و مرز بین داده ها را بتونه پیدا کنه چند بایت را خالی می گذاره تا به کلمه ی بعدی رفته و
نوع بعدی که نیاز به 4 بایت داره را در کلمه ی بعدی رم مینویسه تا مطمئن شه ، در زمان خواندن دچار مشکل نخواهد شد یعنی میتونیم شکل زیر را فرض کنیم :
به این کار در علم معماری کامپیوتر padding (حتما با این اصطلاح آشنا هستید) گفته می شود تا مطمئن شویم در زمان خواندن با هیچ مشکلی روبرو نخواهیم شد و به اون فضا های خالی و بی کاربرد Slack Bytes گفته میشه ،
البته میشه به کامپایلر اعلان کرد که این فضا های خالی را در نظر نگیره و داده ها را عینا پشت سرهم بنویسه (البته من خودم هنوز با کامپایلر msvc موفق به اینکار نشدم) ، بدیهی عواقب این کار به عهده ی خود برنامه نویس هست..
نکته : کد های بالا ، با کامپایلر msvc برای زبان C++ تست شده ، از اونجایی که بیشتر مخاطبین این سایت از زبان C# استفاده می کنن ، برای تست از اونجایی که
Structure ها در دات نت نوع های unmanaged خوانده میشه برای بدست آوردن Sizeof نمیتونید از Sizeof معمولی در C# استفاده کنید ، برای اینکار از متد Sizeof که در کلاس Marshal قرار دارد استفاده کنید ، کلاس Marshal در فضای نام System.Runtime.InteropServices قرار دارد ، برای استفاده هم به این شکل میتونید استفاده کنید :
علاقه مندی ها (Bookmarks)