اینم یه تجربه پراکنده دیگه!
من مدتهاست که به عنوان یکی از کارهای اصلی به زبان C برای سیستمهای برنامه مینویسم. یعنی یه دستگاه محدود رو آماده میکنم که یه کار خاص رو انجام بده.
یکی از بزرگترین ویژگیهای این دستگاهها اینه که حافظه محدودی دارن و بعضی وقتها بایستی حواس برنامه نویس به اینکه اولا چقدر حافظه مصرف شده و دوما اینکه متغیرهای برنامه ای که مینویسه کجای حافظه تعریف میشن باشه.
اگه با اسمبلی آشنا باشید هر برنامه از سه قسمت Data, Code, Stack تعریف میشه. که خود Data Segment هم از سه بخش Heap, Data, BSS تشکیل میشه. که توضیح هرکدوم این بخشها داستان متفاوتی داره. حالا توی شبه کد پایین توضیح میدم که اینها با هم چه تفاوتی داره
int a; void myFunc(void) { int b; static int c; int *d = malloc(sizeof(int)); ... return; }
توی این شبه کد متغیر global به نام a وجود داره که توی data و یا BSS تعریف میشه. متغیر b چون یک متغیر محلیه توی stack تعریف میشه. متغیر c یک متغیر محلی استایتک هست و به دلیل استاتیک بودنش توی data و یا BSS تعریف میشه. پوینتر d همه به یه آدرس توی heap اشاره میکنه چون این متغیر بصورت داینامیک تعریف شده و متغیر داینامیک در heap درست میشه. تفاوت data و BSS در اینه که متغیرهایی که مقدار اولیه غیر صفر دارن توی data تعریف میشن و متغیرهایی که مقدار اولیه ندارن و یا صفرن توی BSS تعریف میشن.
حالا مشکلی که وجود داشت اینه که من متغیرهای بزرگی توی متن تابع هام داشتم که باعث میشد حجم محدود stack موجود پر بشه و نرم افزار به خطای زمان اجرا بر بخوره. که با تغییر اونها به متغیرهای static محل نگهداری اونها به BSS یا Data تغییر مکان پیدا کرد و مساله حل شد.
همین!