آموزش کلاس های ذخیره سازی در ++C (به زبان ساده)
در این آموزش، در مورد کلاس های مختلف ذخیره سازی در ++C یاد خواهید گرفت. یعنی: local, global, static local, register and thread local.
هر متغیر در ++C دارای دو ویژگی است: نوع و کلاس ذخیره سازی.
نوع خاص داده ها را می توان در یک متغیر ذخیره کرد. به عنوان مثال: int، float، char و غیره.
کلاس ذخیره سازی دو ویژگی مختلف یک متغیر را کنترل می کند: طول عمر (تعیین اینکه متغیر چه مدت می تواند وجود داشته باشد) و محدوده (تعیین اینکه کدام بخش از برنامه بتواند به آن دسترسی پیدا کند).
بسته به کلاس ذخیره سازی متغیر، می توان آن را به ۵ نوع اصلی تقسیم کرد:
- Local variable _ متغیر محلی
- Global variable_ متغیر سراسری
- Static local variable_متغیر محلی ایستا
- Register Variable_ متغیر ثبات
- Thread Local Storage_ذخیره سازی محلی thread
متغیر محلی (local variable)
متغیر تعریف شده در داخل تابع (تعریف شده در داخل بدنه تابع بین براکت ها) متغیر محلی یا متغیر خودکار(automatic ) نامیده می شود.
محدوده دسترسی آن تنها محدود به تابع تعریف شده است. به عبارت ساده، متغیر محلی می تواند تنها در داخل تابع قابل دسترسی باشد.
هنگامی که اجرای تابع تمام می شود، طول عمر متغیر محلی به پایان می رسد (از بین می رود).
مثال ۱ : متغیر محلی
- #include <iostream>
- using namespace std;
- void test();
- int main()
- {
- // local variable to main()
- int var = 5;
- test();
- // illegal: var1 not declared inside main()
- var1 = 9;
- }
- void test()
- {
- // local variable to test()
- int var1;
- var1 = 6;
- // illegal: var not declared inside test()
- cout << var;
- }
متغیر var را نمی توان داخل test()و var1 را نمی توان در داخل تابع ()main استفاده کرد.
کلید واژه auto نیز قبل از تعریف متغیرهای محلی استفاده می شود: auto int var؛
اما، بعد از C ++ 11، auto معنی متفاوتی پیدا کرد و نباید برای تعریف متغیرهای محلی استفاده شود.
متغیر سراسری (global variable)
اگر متغیر بیرون از تمام توابع تعریف شود، به آن متغیر سراسری می گوییم.
محدوده دسترسی متغیر سراسری کل برنامه است. به این معنی که می تواند در هر بخش از برنامه مورد استفاده قرار گیرد و تغییر یابد.
به همین ترتیب، زمانی که برنامه به پایان برسد، طول عمر متغیر هم به پایان می رسد.
مثال ۲ : متغیر سراسری
- #include <iostream>
- using namespace std;
- // Global variable declaration
- int c = 12;
- void test();
- int main()
- {
- ++c;
- // Outputs 13
- cout << c <<endl;
- test();
- return 0;
- }
- void test()
- {
- ++c;
- // Outputs 14
- cout << c;
- }
خروجی
۱۳
۱۴
در برنامه بالا c متغیر سراسری است.
متغیر برای هر دو تابع ()main و ()test در دسترس است.
متغیر محلی ایستا (static local variable)
کلید واژه ی static برای تعریف متغیر ایستا استفاده می شود. برای مثال:
… .. …
int main()
{
static float a;
… .. …
}
متغیر محلی ایستا تنها در داخل تابعی که تعریف شده است، قابل دسترسی است. (مشابه متغیر محلی) اما طول عمرش برابر است با زمانی که تابع فراخوانی می شود تا وقتی برنامه به پایان می رسد.
تفاوت اصلی متغیر محلی و متغیر محلی ایستا این است که مقدار متغیر ایستا تا پایان برنامه از بین نمی رود.
مثال ۳: متغیر محلی ایستا
- #include <iostream>
- using namespace std;
- void test()
- {
- // var is a static variable
- static int var = 0;
- ++var;
- cout << var << endl;
- }
- int main()
- {
- test();
- test();
- return 0;
- }
خروجی
۱
۲
در برنامه بالا، تابع test()، ۲ بار فراخوانی می شود.
در طول اولین فراخوانی، متغیر var به عنوان متغیر ایستا اعلام شده و با ۰ مقدار دهی می شود. سپس ۱ به var اضافه شده که در صفحه نمایش داده می شود.
وقتی تابع ()test پایان یافت، متغیر var هنوز هم وجود دارد، زیرا یک متغیر ایستا است.
در طول فراخوانی دوم، متغیر جدیدی ایجاد نشده است. همان var 1 واحد افزایش می یابد و سپس روی صفحه نمایش داده می شود.
خروجی برنامه فوق اگر var از نوع متغیر ایستا تعریف نشده باشد:
۱
۱
متغیر ثبات(register variable) (حذف شده در C ++ 11)
کلید واژه register برای تعریف متغیرهای ثبات استفاده می شود.
متغیرهای ثبات شبیه به متغیرهای خودکار هستند و فقط در یک تابع خاص وجود دارند و فرض شده که سریع تر از متغیرهای محلی باشند.
اگر برنامه با متغیر ثبات مواجه شود، متغیر را در ثبات های پردازنده ذخیره می کند نه در حافظه که باعث می شود سریع تر از متغیرهای محلی باشد.
با این حال، این کلید واژه در C ++ 11 منسوخ شده و نباید مورد استفاده قرار گیرد.
ذخیره سازی محلی thread
ذخیره سازی محلی thread مکانیزمی است که متغیرها را جوری تخصیص می دهد که یک نمونه از متغیر در هر thread موجود باشد.
برای این منظور از کلید واژه ی keyword_local استفاده می شود.