آموزش C++ کلاس های حافظه
یک کلاس حافظه محدوده حضور متغیر در برنامه (scope) و مدت حضور یا طول عمر متغیرها و یا توابع ( Life Time ) را در یک برنامه C++ تعیین می کند.
پس با توصیفات بالا متوجه میشوید که از این پس میتوانید برنامه ای بنویسید که اولا حافظه زیادی اشغال نکند و از منابع حافظه کامپیوتر به صورت بهینه استفاده کند و دوما سرعت اجرای بالاتری داشته باشند و سوما برنامه دارای خطای کمتر و عیب یابی سریع تری نیز میشود.
در زبان c++ 5 نوع کلاس حافظه وجود دارد. کلاس های حافظه زیر را میتوان در یک برنامه C++ استفاده کرد.
- auto یا خودکار
- register یا ثبات
- static یا ایستا
- extern یا خارجی
- mutable
کلاس حافظه auto
auto یک کلاس حافظه پیش فرض برای تمامی متغیر های محلی است و اگر نوع کلاس حافظه تعیین نشود، auto برای آن در نظر گرفته می شود.
{
int mount;
auto int month;
}
مثال فوق دو متغیر را با یک کلاس حافظه یکسان تعریف می کند. کلاس حافظه auto فقط می تواند در داخل توابع، مانند متغیرهای محلی استفاده شود.
کلاس حافظه register
کلاس حافظه register یا ثبات برای تعریف متغیرهای محلی استفاده میشود که باید به جای RAM در register یا ثبات های CPU ذخیره می شوند. بنابراین سرعت انجام عملیات با آنها بسیار بالاست و در نتیجه موجب افزایش سرعت اجرای برنامه میشود اما محدودیت هایی ر ا نیز ایجاد میکنندکه در زیر به برخی از آنها به اختصار اشاراه می کنیم.
محدودیت ها
- همان طور که اشاره شد، متغیر از نوع ثبات در صورت امکان در یکی از ثباتهای CPU قرار میگیرد. بنابراین به دلیل کم بودن تعداد ثباتهای CPU، تعداد محدودی متغیر میتوانند در ثباتها قرار بگیرند. پس اگر تعداد متغیرهایی که از نوع کلاس حافظه ثبات تعریف شده اند زیاد باشند، کامپایلر کلاس حافظه ثبات را از متغیرها حذف میکند .
- کلمه کلیدی register تنها میتواند برای متغیرهای محلی و همچنین پارامترهای تابع به کار گرفته شود .
- انواع متغیر که میتوانند دارای کلاس حافظه ثبات باشند، در کامپیوترهای مختلف، متفاوت است . دلیل این امر هم این است که متغیرهای مختلف، تعداد بایت متفاوتی را به خود اختصاص میدهند.
- آدرس در مفهوم کلاس حافظه ثبات بی معنی است. زیرا متغیرها در ثباتهای CPU قرار میگیرند و نه در RAM . پس در مورد آن کلاس حافظه، نمیتوان از عملگر & برای اشاره به آدرس متغیرها استفاده کرد.
{
register int miles;
}
register باید تنها برای متغیرهایی که نیاز به دسترسی سریع مانند شمارنده ها دارند استفاده شود. لازم به ذکر است که تعریف register به این معنی نیست که متغیر در یک register ذخیره خواهد شد. بلکه به این معنی است که ممکن است با توجه به سخت افزار و محدودیت های پیاده سازی در یک register ذخیره شود.
کلاس حافظه static
کلاس حافظه static به کامپایلر میگوید تا به جای آنکه یک متغیر محلی را هر بار که وارد و خارج محدوده می شود ایجاد کند و از بین ببرد، در طول برنامه حفظ کند. بنابراین ساختن متغیرهای محلی به صورت static اجازه می دهد تا ارزش خود را در تمام مدت فراخوانی های توابع حفظ کنند.
static modifier ممکن است بر روی متغیرهای سراسری اعمال شود. از زمانی که این کار انجام شود محدوده یا scope یک متغیر که در آن اعلان شده است محدود می شود.
در C++ هنگامی که static در یکی از اعضای کلاس ها مورد استفاده قرار می گیرد تنها یک نسخه از آن عضو را می توان بین اشیاء دیگر کلاس ها به اشتراک گذاشت.
#include <iostream>
// Function declaration
void func(void);
static int count = 10; /* Global variable */
main() {
while(count--) {
func();
}
return 0;
}
// Function definition
void func( void ) {
static int i = 5; // local static variable
i++;
std::cout << "i is " << i ;
std::cout << " and count is " << count << std::endl;
}
وقتی کد بالا کامپایل و اجرا شود نتیجه زیر نشان داده خواهد شد
i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0
کلاس حافظه extern
کلاس حافظه extern یا خارجی برای ارجاع به یک متغیر سراسری که برای همه فایل های برنامه قابل مشاهده است استفاده می شود . گاهی برنامه ای که می نویسیم خیلی طولانی است که بهتر است برنامه را به واحدهای کوچکتری تقسیم بندی کرد. اگر بخواهیم که متغیرهایی را که در واحد اصلی تعریف شده اند را در واحدهای فرعی استفاده کنیم و دیگر آنها را دوباره در واحدهای فرعی تعریف نکنیم، میتوانیم متغیرهای مورد نظر را با استفاده از کلاس حافظه خارجی یا extern تعریف کنیم . اگر از extern استفاده کنید نمی توانید متغیر را مقدار دهی اولیه کنیدراما می توانید نام آن را در یک مکان ذخیره کنید. در زمان استفاده از extern تنها می توانید آن را اعلان کنید. از این کلاس حافظه عموما در پروژه های بزرگ که حاوی چندین فایل هستند استفاده می شود. مثال زیر نحوه استفاده از کلاس حافظه extern را به طور کامل توضیح داده است.
هنگامی که چندین فایل دارید و یک متغیر یا تابع سراسری را تعریف می کنید که در سایر فایل ها نیز استفاده می شود، extern در فایل دیگری برای ارجاع متغیر یا تابع تعریف شده استفاده می شود. برای درک اینکه extern در کجا استفاده می شود فقط بدانید که برای اعلان یک متغیر سراسری یا یک تابع در فایل دیگر استفاده میشود.
extern modifier اغلب زمانی مورد استفاده قرار می گیرد که دو یا چند فایل متغیرهای سراسری و یا توابع یکسانی را اشتراک بگذارند که در زیر توضیح داده شده است.
محتویات فایل main.c
#include <iostream>
int count ;
extern void write_extern();
main() {
count = 5;
write_extern();
}
محتویات فایل support.cpp
#include <iostream>
extern int count;
void write_extern(void) {
std::cout << "Count is " << count << std::endl;
}
در اینجا، کلمه کلیدی extern برای اعلان شمارش در یک فایل دیگر مورد استفاده قرار می گیرد. در حال حاضر این دو فایل را به صورت زیر کامپایل کنید.
$g++ main.cpp support.cpp -o write
تلاش کنید تا به درستی برنامه را بنویسید و نتیجه را به صورت زیر بررسی کنید
$./write
5
کلاس حافظه mutable
کلاس حافظه mutable تنها بر روی اعضای کلاس که بعدها در ادامه این آموزش ها توضیح داده خواهد شد اجرا می شود. پس از آن که یک شی را const تعریف می کنید، دیگر نمی توانید مقادیر اعضای آن را تغییر دهید. اما اگر عضوی از این کلاس را mutable تعریف کنید، می توانید حتی در حالیکه آن را const تعریف کرده اید، مقادیر آن را تغییر دهید. در جلسات بعدی بیشتر در مورد این نوع کلاس حافظه توضیح خواهیم داد.
نظرات کاربران