کلاس Storage در ++C — راهنمای جامع
در این مقاله در مورد انواع مختلف کلاس Storage در ++C صحبت خواهیم کرد. برخی از این کلاسها شامل local ،global ،static local ،register و thread local هستند. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی به لینک زیر بروید:
هر متغیری در ++C دو ویژگی دارد: type و کلاس storage.
- type نشاندهنده نوع دادهای است که قرار است در متغیر ذخیره شود. برای نمونه: int ،float ،char و غیره.
- کلاس storage نیز دو مشخصه متفاوت متغیر یعنی «عمر» و «دامنه» آن را کنترل میکند. منظر از عمر متغیر این است که متغیر تا چه زمانی میتواند حیات داشته باشد. دامنه نیز مشخص میکند که متغیر در چه بخشهایی از برنامه قابل دسترسی است.
بسته به کلاس storage یک متغیر آن را میتوان به چهار نوع عمده دستهبندی کرد:
- متغیر محلی (Local variable)
- متغیر سراسری (Global variable)
- متغیر محلی استاتیک (Static local variable)
- متغیر ثبات (Register Variable)
- متغیر محلی نخ (Thread Local Storage)
متغیر محلی
متغیر محلی درون یک تابع یعنی در بدنه تابع و بین آکولادها تعریف میشود. این متغیر به نام متغیر محلی یا اتوماتیک نامیده میشود. دامنه این متغیر محدود به تابعی است که در آن تعریف شده است. به بیان ساده متغیرهای محلی تنها درون یک تابع وجود دارند و آنجا میتوانند مورد دسترسی قرار گیرند. عمر یک متغیر محلی زمانی که برنامه از تابع خارج شود به پایان میرسد.
مثال 1: متغیر محلی
1#include <iostream>
2using namespace std;
3void test();
4int main()
5{
6 // local variable to main()
7 int var = 5;
8 test();
9
10 // illegal: var1 not declared inside main()
11 var1 = 9;
12}
13void test()
14{
15 // local variable to test()
16 int var1;
17 var1 = 6;
18 // illegal: var not declared inside test()
19 cout << var;
20}
متغیر var نمیتواند درون ()test استفاده شود و var1 نیز نمیتواند درون تابع ()main مورد استفاده قرار گیرد. از کلیدواژه auto برای تعریف کردن متغیرهای محلی قبلی به صورت زیر نیز استفاده میشود:
1auto int var;
اما پس از 11++C کلیدواژه auto معنای متفاوتی یافته و نباید برای تعریف کردن متغیرهای محلی استفاده شود.
متغیر سراسری
اگر متغیری خارج از تابعها تعریف شود، در این صورت به نام متغیر سراسری شناخته میشود. دامنه یک متغیر سراسری، کل برنامه است. این بدان معنی است که میتواند پس از اعلان شدن، در هر بخشی از برنامه مورد دسترسی قرار گرفته و تغییر یابد.
به طور مشابه پایان عمر آن زمانی است که برنامه خاتمه یابد.
مثال 2: متغیر سراسری
1#include <iostream>
2using namespace std;
3// Global variable declaration
4int c = 12;
5void test();
6int main()
7{
8 ++c;
9 // Outputs 13
10 cout << c <<endl;
11 test();
12 return 0;
13}
14void test()
15{
16 ++c;
17 // Outputs 14
18 cout << c;
19}
خروجی
13 14
در برنامه فوق c یک متغیر سراسری است. در برنامه فوق این متغیر برای هر دو تابع ()main و ()test قابل مشاهده است.
متغیر محلی استاتیک
کلیدواژه static برای تعیین یک متغیر استاتیک استفاده میشود. برای نمونه:
... .. ... int main() { static float a; ... .. ... }
یک متغیر محلی استاتیک تنها درون تابعی که در آن اعلان شده وجود دارد، اما عمر آن از زمانی آغاز میشود که تابع فراخوانی شود و تنها زمانی خاتمه مییابد که برنامه پایان گیرد. تفاوت اصل بین متغیر محلی و متغیر استاتیک این است که مقدار متغیر استاتیک در انتهای برنامه حفظ میشود.
مثال 3: متغیر محلی استاتیک
1#include <iostream>
2using namespace std;
3void test()
4{
5 // var is a static variable
6 static int var = 0;
7 ++var;
8 cout << var << endl;
9}
10int main()
11{
12
13 test();
14 test();
15 return 0;
16}
خروجی
1 2
در برنامه فوق، تابع ()test دو بار فراخوانی میشود. در طی فراخوانی نخست، متغیر var 2 به صورت یک متغیر استاتیک اعلان میشود و مقدار اولیه آن روی 0 تعیین میشود. سپس مقدار 1 به var اضافه میشود که در صفحه نمایش پیدا میکند. زمانی که تابع ()test بازگشت یابد، متغیر var همچنان وجود دارد، زیرا یک متغیر استاتیک است.
در طی فراخوانی تابع دوم، هیچ متغیر var جدیدی ایجاد نمیشود. همان متغیر var به میزان 1 واحد افزایش مییابد و سپس روی صفحه نمایش پیدا میکند. در صورتی که var به صورت متغیر استاتیک تعیین نشده باشد، خروجی برنامه فوق به صورت زیر خواهد بود:
1 1
متغیر ثبات (در 11 ++C منسوخ شده است)
کلیدواژه register برای تعیین متغیرهای ثبات استفاده میشود. متغیرهای ثبات مشابه متغیرهای اتوماتیک هستند و صرفاً درون بدنه یک تابع خاص حضور دارند. تصور میشود که این متغیرها سریعتر از متغیرهای محلی هستند. اگر برنامهای با یک متغیر ثبات مواجه شود، متغیر را به جای حافظه، در صورت امکان، در ثبات پردازنده ذخیره میکند. این امر موجب میشود که سریعتر از متغیرهای محلی باشد. با این حال این کلیدواژه در نسخه 11 ++C منسوخ اعلام شده و نباید مورد استفاده قرار گیرد.
ذخیره محلی نخ
ذخیره محلی نخ ساز و کاری است که متغیرها از طریق آن به طرزی تخصیص پیدا میکنند که یک وهله از متغیر در هر نخ وجود داشته باشد. کلیدواژه thread_local به این منظور استفاده میشود. بدین ترتیب به پایان این مقاله با موضوع معرفی انواع مختلف متغیرهای زبان برنامهنویسی ++C رسیدیم. در بخش بعدی این سری مقالات با تابعهای بازگشتی در ++C آشنا میشویم. برای مطالعه آن مقاله به لینک زیر رجوع کنید:
اگر این مطلب برای شما مفید بوده است، پیشنهاد میکنیم از آموزشهای زیر نیز استفاده کنید:
- مجموعه آموزشهای برنامهنویسی
- مجموعه آموزشهای پروژه محور #C
- آموزش برنامه نویسی C++
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- آموزش ++C — راهنمای شروع یادگیری
==