خرداد
۲۳
۱۳۹۱

متغیرهای کلاس حافظه ایستا در C/C++‎

سلام

چون راجع به متغیرهای کلاس حافظه ایستا در دانشگاه کمتر صحبت میشه امروز میخوام در حد سواد کم خودم کمی راجع به این نوع متغیرها در زبان سی و سی پلاس پلاس صحبت کنم.

 این متغیرها با کلمات کلیدی static و یا extern تعریف میشن. همچنین متغیرهای سراسری که در بیرون از توابع  (و بدون استفاده از این نام ها) تعریف میکنیم نیز در این کلاس حافظه طبقه بندی میشوند.

 این متغیرها خصوصیات مشترکی دارند. از جمله اینکه زمان زندگی(lifetime)  اونها از زمان تعریف تا پایان اجرای برنامه ادامه داره و اینکه این متغیرها حتما در زمان تعریف مقداردهی اولیه میشوند و حتی اگر شما صریحا اونها رو مقدار دهی اولیه نکنید، کامپایلر مقدار اولیه صفر رو به متغیر ایستای شما اختصاص خواهد داد.

Scope یا همون حوزه تعریف این متغیرها به محل تعریف شدن اونها بستگی داره. متغیرهایی که بیرون از توابع تعریف میشن از محل تعریف تا انتهای همون فایل میتونن مورد ارجاع قرار بگیرن.

متغیرهای ایستایی که با کلمه کلیدی static درون توابع تعریف میشن دارای حوزه تابع هستند. به این معنی که  فقط درون همون تابع میتونیم از اونها استفاده کنیم. در نتیجه از لحاظ حوزه تفاوتی با متغیرهای غیر ایستا در اینجا ندارن و تفاوتشون در زمان زندگی اونهاست.

به این معنی که متغیرهای ایستایی که درون تابع تعریف میشن تا پایان اجرای برنامه وجود دارن و اگه دوباره به همون تابع برگردیم مقدار گذشته ی خودشون رو حفظ کردند در حالی که عمر متغیرهای غیر ایستا با پایان تابع به انتها میرسه و حافظه ای که در دسترسشون بوده آزاد میشه. با دقت در این مسئله تفاوت حوزه تعریف و زمان زندگی هم مشخص خواهد شد.

مسئله بعدی راجع به متغیرهای سراسریه. این متغیرها نیز از نوع ایستا هستند و میتونیم درون فایلی که تعریف شدند از اونها استفاده کنیم. تمام توابعی که بعد از تعریف این متغیرها درون فایل قرار دارن میتونن به این متغیرها دسترسی داشته باشن.

البته نکته مهم اینه که استفاده از این متغیرها به علت امکان دسترسی توسط توابع غیر ضروری و بروز اشتباه های ناخواسته و سنگین باید تا حد امکان محدود باشه و فقط در مواقع ضروری که کارایی یا دلیل موجه دیگه ای وجود داشته باشه بهتره که از این نوع متغیرها استفاده کرد.

همونطور که گفتم متغیرهایی که درون فایل به صورت سراسری تعریف میشوند دارای حوزه فایل هستند. یعنی فقط توابعی که درون اون فایل قرار دارند توانایی دسترسی به اون متغیر رو دارند و توابعی که در فایلهای دیگه قرار دارند به این متغیر دسترسی نخواهند داشت.

با این وجود ما در برنامه های چند فایلی گاهی نیاز داریم که در چند فایل مختلف به یک متغیر دسترسی داشته باشیم. برای رفع این نیاز از کلمه کلیدی extern کمک خواهیم گرفت. به این ترتیب که بعد از تعریف متغیر به صورت سراسری درون فایل اصلی، در فایلهای دیگری که به اون متغیر نیاز دارند، اون رو با کلمه کلیدی extern دوباره معرفی میکنیم. با این کار کامپایلر فضای جدیدی به متغیر ما اختصاص نخواهد داد و از همون متغیر اصلی که قبلا تعریف کردیم در این فایل نیز استفاده خواهد کرد.

اگر متغیری که به صورت سراسری تعریف میکنید فقط در همون فایل مورد نیاز باشه بهتره برای امنیت بالاتر قبل از تعریفش کلمه کلیدی static رو به کار ببرید. با اینکار تاکید خواهید داشت که این متغیر فقط درون همین فایل قابل استفاده است. در این صورت اگر در فایل دیگری این متغیر رو به صورت extern تعریف کنید و بهش رجوع کنید با خطا مواجه خواهید شد.

در این پست نمیخوام راجع به انواع خطاها صحبت کنم اما خیلی خلاصه بگم که خطایی که از این نوع تعریف ها گرفته میشه مربوط به زمان لینک است و در واقع لینکر خطا رو اعلام میکنه و در زمان کامپایل اشتباهی از کد شما گرفته نخواهد شد.

در آخر برای نمونه مثال خیلی ساده ای رو در لینک زیر قرار دارم که میتونید یک نمونه استفاده بسیار ساده از متغیرهای کلاس حافظه ایستا رو مشاهده نمایید. موفق باشید.

دانلود مثالی از کلاس های حافظه ایستا

//

//

توضیح:این پست از پستهای وبلاگ سابق اینجانب به آدرس mohsen-rsd.blogfa.com بوده است.

اشتراک گذاری این مطلب:

نوشته‌های مرتبط

درباره نویسنده

برنامه‌نویس ++‏C/C‏ - برنامه‌نویس سیستم‌های گرافیکی با استفاده از کتابخانه ‏OpenGL - برنامه‌نویس #‏C و ..‏



۳ دیدگاه افزودن دیدگاه +

  • از تضیحات رسا و کامل شما بسیار ممنونم.
    کلی دعای خیر پشت سرتان
    موفق باشید

    • من هم از حسن نظر شما و همکارانتون بسیار ممنونم.

  • بسیار ممنون
    روان و گویا بیان کردید

فرستادن دیدگاه