کلاس‌های حافظه در C

اگر شما به زبان‌های C یا C++ برنامه نوشته باشید، به احتمال زیاد به مفهوم کلاس‌های حافظه برخورد کرده‌اید . و اگر شما از این مفهوم بی‌اطلاع هستید یا اطلاعات کمی دارید، توصیه می‌کنیم که این مقاله را مطالعه کنید .
سوالی که برای شما پیش آمده این است که کلاس حافظه به چه چیزی می‌گویند ؟ پاسخ این است که کلاس حافظه هر متغیر دو چیز اساسی را برای آن متغیر تعیین می‌کند :
•مدت حضور یا همان طول عمر ( Life Time ) آن متغیر
•محدوده حضور متغیر در برنامه ( Scope )
پس با توجه به این دو مورد که در بالا ذکر شد، ما می‌توانیم برنامه‌هایی را بنویسیم که :
•از منابع حافظه کامپیوتر به خوبی بهره ببرند و بی‌مورد حافظه اشغال نشود
•سرعت اجرای بالاتری دارند
•دچار خطای کمتر و همچنین عیب یابی آسان‌تری باشند
4 نوع کلاس‌های حافظه در زبان C و C++ به صورت مشترک تعریف شده‌است :
•اتوماتیک ( Automatic )
•خارجی ( Extern )
•استاتیک ( Static )
•ثبات ( Register )
و علاوه بر این 4 مورد، در زبان C++ کلاس حافظه دیگری به نام Mutable هم وجود دارد که بحث در این کلاس حافظه از سطح مقاله فراتر است و از توضیح آن پرهیز می‌کنیم .
برای تعیین نوع کلاس حافظه برای متغیرها باید به صورت زیر عمل کرد :
که نوع کلاس حافظه با استفاده از کلمات کلیدی auto ( برای کلاس حافظه اتوماتیک) ، static ( برای کلاس حافظه استاتیک ) ، register ( برای کلاس حافظه ثبات ) و extern ( برای کلاس حافظه خارجی ) تعیین می‌گردد . به عنوان مثال در کد زیر دو متغیر a و b ( با مقدار دهی اولیه 10 برای b )، از نوع عدد صحیح تعریف شده‌اند که کلاس حافظه آن‌ها static می‌باشد .
static int a,b=10;
کلاس حافظه اتوماتیک
این کلاس که پر کاربردترین کلاس حافظه هست با کلمه کلیدی auto مشخص می‌شود . اگر نوع کلاس حافظه متغیری را ذکر نکنیم، کامپایلر خود به خود auto در نظر می‌گیرد .این نوع متغیرها دارای خواص زیر هستند :
به صورت محلی ( Local ) هستند . یعنی در داخل بلاکی که تعریف شده‌اند، قابل دسترسی‌اند .
هنگام ورود یک متغیر به یک تابع یا بلاک، به آن حافظه اختصاص داده می‌شود و این حافظه هنگام خروج از تابع یا بلاک، پس گرفته می‌شود .
چندین بار می‌توانند مقدار اولیه بگیرند .
کلاس حافظه خارجی
اگر برنامه‌هایی که می‌نویسیم، طولانی باشند، می‌توانیم آن را به قسمت‌های کوچکتری تقسیم کنیم که به هر قسمت آن واحد ( یا همان Unit ) گفته می‌شود . اگر بخواهیم که متغیرهایی را که در واحد اصلی تعریف شده‌اند را در واحدهای فرعی استفاده کنیم و دیگر آن‌ها را دوباره در واحدهای فرعی تعریف نکنیم، می‌توانیم متغیرهای مورد نظر را با استفاده از کلاس حافظه خارجی تعریف کنیم . بدین منظور باید این متغیرها در واحد اصلی به صورت عمومی تعریف شده باشند و در واحد فرعی از کلمه کلیدی extern قبل از تعریف این متغیرها استفاده کنیم .
طول عمر متغیرهایی که از کلاس حافظه extern هستند، از هنگام شروع برنامه تا پایان آن است و همچنین این متغیرها در سراسر برنامه قابل دسترسی هستند .
طول عمر آن‌ها برابر با طول عمل بلاک می‌باشد
کلاس حافظه استاتیک
این کلاس را می‌توانیم به دو قسمت کلی تقسیم کنیم :
•متغیرهای محلی کلاس حافظه استاتیک
•متغیرهای عمومی کلاس حافظه استاتیک
متغیرهای استاتیک محلی دارای خواص زیر هستند :
فقط در همان تابعی که تعریف شده‌اند، قابل دسترسی‌اند .
می‌توانند مقدار اولیه بگیرند و فقط یکبار ارزش دهی اولیه را قبول می‌کنند
در هنگام خروج از ار تابع، مقادیر متغیرها، آخرین مقداری خواهد بود که در تابع به آن‌ها اختصاص یافته‌است و هنگام اجرای دوباره تابع، مقدار اولیه نمی‌گیرند .
متتغیرهای استاتیک عمومی فقط در یک واحد از برنامه، از جایی که تعریف می‌شوند، به بعد قابل دسترسی‌اند .
کلاس حافظه ثبات
متغیرهای کلاس حافظه ثبات ( register ) در صورت امکان در یکی از ثبات‌های CPU قرار می‌گیرند؛ لذا سرعت انجام عملیات با آن‌ها بسیار بالاست و در نتیجه موجب افزایش سرعت اجرای برنامه می‌شود .
ولی این کلاس دارای محدودیت‌های زیر است :
همان طور که در بالا ذکر شد، متغیر از نوع ثبات در صورت امکان در یکی از ثبات‌های CPU قرار می‌گیرد . زیرا به دلیل کم بودن تعداد ثبات‌های CPU، تعداد محدودی متغیر می‌توانند در ثبات‌ها قرار بگیرند. پس اگر تعداد متغیرهایی که از نوع کلاس حافظه ثبات تعریف شده‌اند زیاد باشند، کامپایلر کلاس حافظه ثبات را از متغیرها حذف می‌کند .
کلمه کلیدی register تنها می‌تواند برای متغیرهای محلی و همچنین پارامترهای تابع به کار گرفته شود .
انواع متغیر که می‌توانند دارای کلاس حافظه ثبات باشند، در کامپیوترهای مختلف، متفاوت است . دلیل این امر هم این است که متغیرهای مختلف، تعداد بایت متفاوتی را به خود اختصاص می‌دهند .
آدرس در مفهوم کلاس حافظه ثبات بی‌معنی است و زیرا متغیرها در ثبات‌های CPU قرار می‌گیرند و نه در RAM . پس در مورد ان کلاس حافظه، نمی‌توان از عملگر - برای اشاره به آدرس متغیرها استفاده کرد .