الگوریتمستان - کلاس‌های حافظه در ++C

آشنایی با کلاس‌های حافظه و کاربرد آنها در زبان ++C

✤    ۶ شهریور ۱۳۸۵ - آخرین به‌روزرسانی: ۵ اسفند ۱۳۹۳

زبان برنامه‌نویسی ++C از کلاس‌های حافظه‌ (Storage Classes) مختلفی برای تعریف متغیرها پشتیبانی می‌کند.

  

کلاس حافظه اتوماتیک (auto)

  [برگرد بالا]

این کلاس اصلی‌ترین کلاس حافظه زبان ++C محسوب می‌شود. متغیرهایی که توسط این کلاس تعریف می‌شوند، با خروج از محدوده تعریف به طور خودکار از بین می‌روند. بنابراین تمامی متغیرهای عادی از این نوع کلاس هستند. یعنی شما برای مشخص کردن کلاس حافظه اتوماتیک نیاز به انجام کار خاصی ندارید. اما برای تاکید بر اتوماتیک بودن کلاس حافظه، می‌توانید از کلمه کلیدی auto استفاده کنید. به عنوان نمونه، دو عبارت زیر هم ارز هستند:

  

int n;

auto int n;

  

توجه: مفهوم کلمه کلیدی auto در 11++C و بعدتر تغییر یافته و به معنی کلاس حافظه اتوماتیک نیست.

  

کلاس حافظه استاتیک (static)

  [برگرد بالا]

متغیرهای کلاس حافظه استاتیک تا اتمام برنامه حافظه اختصاصی خودشان را حفظ می‌کنند؛ حتی اگر کنترل برنامه به خارج ناحیه تعریف آنها منتقل شود. مثال زیر را در نظر بگیرید:

  

void func() {

  static int y = 1;

  cout << y << "\t";

  y *= 2;

}

  

int main() {

  func();

  func();

  func();

  return 0;

}

  

خروجی برنامه:

  

1 2 4

  

در اولین فراخوانی تابع func، برای متغیر y حافظه اختصاص داده می‌شود. خط آخر تابع مقدار 2 را در y قرار می‌دهد. اما با خروج از تابع متغیر از بین نمی‌رود. بار بعد که تابع فراخوانی شد، مقداردهی اولیه y (یعنی 1) در نظر گرفته نمی‌شود. در نتیجه عدد 2 چاپ می‌شود و الی آخر. حافظه اختصاصی برای y فقط زمانی آزاد خواهد شد که اجرای برنامه تمام شود.

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

  

void func() {

  static int y;

  y = 1;

  cout << y << "\t";

  y *= 2;

}

  

void main() {

  func();

  func();

  func();

}

  

خروجی برنامه:

  

1 1 1

  

کلاس حافظه ثبات (register)

  [برگرد بالا]

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

  

‌void main() {

  register int i;

  for(i = 0 ; i < 10 ; i++)

    cout << i * i << "\t";

}

  

توجه: استفاده از کلاس حافظه ثبات یک درخواست محسوب می‌شود. یعنی ممکن است بنا به هر دلیلی تخصیص حافظه از CPU امکان نداشته باشد. در این حالت کلاس حافظه در نظر گرفته نمی‌شود.

  

کلاس حافظه خارجی (extern)

  [برگرد بالا]

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

  

file1:

int n;

  

file2:

extern int n;

cout << n;

  

توجه:

  [برگرد بالا]

در استفاده از کلاس حافظه خارجی باید به دو نکته توجه داشت:

1 - کلاس حافظه خارجی برای متغیرهای عمومی استفاده می‌شود.

2 - دو فایلی که با هم تبادل متغیر می‌کنند باید از یک پروژه باشند.

  

کلاس حافظه mutable

  [برگرد بالا]

این کلاس حافظه در تعاریف کلاس‌ها و اشیاء کلاس کاربرد دارد. زمانی که یک شی‌ء از کلاسی به صورت const تعریف شده باشد، امکان تغییر اعضای آن وجود ندارد. اما اگر عضوی با کلمه کلیدی mutable معرفی گردد، این امکان فراهم می‌شود. به عنوان مثال:

  

class MyClass {

    ...

  public:

    ...

    int a;

    mutable int b;

    ...

};

  

int main() {

  const MyClass sample;

  sample.a = 1;  //  مجاز نیست

  sample.b = 2;  //  مجاز است

  ...

}


نسخه‌ی اولیه‌ی این نوشته از وبلاگ برنامه‌نویسی و طراحی الگوریتم به الگوریتمستان منتقل شده است.

تا کنون ۴۵ امتیاز ثبت شده
نوشته لایک نداشت؟
 
به اشتراک گذاری نوشته

amasoudfam.ir/l/g4m8r

اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram

نام: *  
پست الکترونیک (محرمانه):
پیام: *  
• سارا
۲۷ اردیبهشت ۱۳۸۶، ساعت ۰۱:۰۶

ممكنه منو در حل برنامه زیر به زبان c++ کمک کنید :

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

• مهرزاد
۲۱ خرداد ۱۳۸۷، ساعت ۱۶:۴۵

سلام

از صمیم قلب برای شما آقای اقدسی فام و همکاران محترم شما آرزوی بهترین ها رو دارم

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

و اینکه درمورد استفاده از مخرب ها در++C مطلب بگذارید      متشکرم

• parvin
۲۰ فروردین ۱۳۹۰، ساعت ۱۰:۱۱

salam khaste nabashid

ye soal dashtam az khedmate u

فرق بين متغيير خارجي با متغيير عمومي چيست؟

ممنون ميشم هرچه سريعتر جواب بديد.

۲۰ فروردین ۱۳۹۰، ساعت ۱۹:۳۲
• مسعود اقدسی‌فام

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

• نادر
۷ دی ۱۳۹۰، ساعت ۱۰:۴۸

تعریف کلاس صف در c++

باتشکر

• مهدی
۲۹ اسفند ۱۳۹۱، ساعت ۱۹:۵۵

ممنون، عالی بود01

• عبدالرحمن
۱۱ آذر ۱۳۹۲، ساعت ۲۱:۵۵

سلام چند روزی است که با حل یک مساله برنامه نویسی مشکل پیدا کردم  اگه می تونین کمک کنین ممنونم

مساله عدد دراماتیک:

   به یه عدد صحیح مثبت n_دراماتیک گفته می شه ، اگه حاصلضرب اون عدد در n ، از یکبار چرخش ارقامش به سمت راست حاصل بشه. مثلا اعداد 102564 و 128205 اگه در 4 ضرب بشن ، جواب بصورت 410256 و 512820 در می یاد. پس هر دو عدد 4_دراماتیک هستن.

   حالا شما باید برنامه ای بنویسید که اعداد تک رقمی و غیر صفر n و k رو بگیره ، و کوچکترین عدد مثبت n_دراماتیک رو که رقم یکانش k هست پیدا کنه! اگر همچین عددی موجود نبود ، صفر رو نتیجه بده.

   سطر اول فایل ورودی برنامه تعداد موارد آزمایشی رو مشخص می کنه ، و در سطرهای بعدی زوج اعداد n و k قرار می گیرن. مثلا اگه فایل ورودی به صورت زیر باشه:

   2

   4 5

   2 1

   فایل خروجی باید اینطور باشه:

   128205

   0

• Mahdi
۱۵ بهمن ۱۳۹۲، ساعت ۱۱:۵۸

تشکر.مطلبی ساده و بسیار مفهومی بود.

• مهدی
۹ اسفند ۱۳۹۴، ساعت ۰۰:۳۱

سلام/ممنون از شما/مطلب خوبی بود انسافا

یه سوال : این متغیر ها رو از کلاس دیگه هم میشه با تعریف یه شی از اون کلاس به صورت مستقیم به متغییر های سراسریش دسترسی یدا کرد، حالا چه نیازی هستش به EXTERN ?

سوال بعد : گفتین تو نسخه 11++C کلمه کلیدی AUTO نقشش عوض شده، اینو از کجا فهمدید؟ این سایتی که تغیرات زبان C درش قرار میگیره چیه؟

سوال آخر : و این که از کجا میشه فهمید نسخه زبان یه کامپیایلر چنده؟

مثلا از زبان نسخه چند C استفاده میکنه و پشتیبانیش میکنه؟؟؟

۱۰ اسفند ۱۳۹۴، ساعت ۲۱:۲۶
• مسعود اقدسی‌فام

سلام

خوشحالم که نوشته براتون مفید بوده.

در مورد سوال اولتون به لینک زیر مراجعه کنید:

http://stackoverflow.com/questions/10422034/when-to-use-extern-in-c

اخبار زبان‌های برنامه‌نویسی و تغییرات اونها رو می‌تونید از طریق وب‌سایت‌های خبری یا سایت‌های رسمی توسعه‌ی زبان‌ها پیگیری کنید. مثلا این لینک:

https://isocpp.org

در مورد سوال سوم هم لینک زیر رو ببینید:

http://www.cplusplus.com/forum/general/90675/

• مهدی
۱۸ اسفند ۱۳۹۴، ساعت ۲۲:۴۱

سلام دوباره04

داداش یه سوال

تعریف متغیر جدید در C++ یا C به چه صورته؟10

من میخوام یه متغییر 8 بیتی از نوع صحیح(INT) درست کنم چون کامپایلری که استفاده میکنم همچین متغییری نداره و چون من برا میکروکنترلر ها برنامه مینویسم و در یه کتابخونه حدود 98 تا متغییر 8 بیتی لازم دارم، و کامپایلری که من استفاده میکنم فقط متغییر 16 بیتی از این نوع(int) داره و اگه بخوام 98 تا متغییر 16 بیتی داشته باشم کل حافظه میکروکنترلر من اشغال میشه الکی، خواستم راهنماییم کنی(کتابی، لینکی و... بهم معرفی کنی یا خودت اگه وقت داری...)

منتظر راهنماییت هستم08

۱۹ اسفند ۱۳۹۴، ساعت ۱۲:۰۷
• مسعود اقدسی‌فام

این کامپایلر متغیر char یا byte نداره؟ این تعریف‌ها یه بایتی هستن.

• مهدی
۱۹ اسفند ۱۳۹۴، ساعت ۱۳:۳۹

char  هشت بیتی داره ولی این برا کاراکتر مگه نیست، این نوع که متغییر عدد صحیح نیست که

و در ضمن byte رو نداره07

راستی یه سوال دیگه : unsigned char و char فرقشون چیه؟04

مگه کد اسکی منفی هم داریم؟10

راستی یه پیشنهاد >>>> اون قسمت امتیاز دهی رو بزار کنار همین قسمت(نظر دادن) >>>> چون هر موقع بخوایم نظر بدیم باید بریم بالای مطلب و امتیاز بدیم و دوباره بیایم اینجا >>> چه کاریه آخه، کدش رو بزار همین جا دیگه>>> این طوری به نظر من بهتره >>> مخصوصا اگه تعداد نظرت خیلی زیاد باشه باید خیلی بری بالا امتیاز بدی و بعد خیلی بیای پایین و نظرت رو بنویسی07

۱۹ اسفند ۱۳۹۴، ساعت ۱۹:۵۷
• مسعود اقدسی‌فام

char همون عدد صحیح یک بایتی هست. فقط نمود کاراکتری هم داره. برای همینم unsigned هم داره. راحت می‌تونید به عنوان عدد یه بایتی ازش استفاده کنید.

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

با این حال سر فرصت این امکان رو اضافه می‌کنم که هم از نزدیک پیام‌ها و هم نزدیک مطلب امکان ارسال امتیاز وجود داشته باشه. ممنونم از ارائه‌ی نظر.

• علی
۸ خرداد ۱۳۹۵، ساعت ۲۰:۲۵

خوب بود

• عgd
۸ دی ۱۳۹۵، ساعت ۱۴:۴۷

عالی بود خصوصا مثالاش

• اسرا
۲۵ آبان ۱۳۹۷، ساعت ۱۱:۱۴

050505131313141414

• aaggg
۱۹ مرداد ۱۳۹۹، ساعت ۲۲:۳۹

سلام ممنون بابت مطلابتنون میشه بیشتر از این قسمت رو بیشتر مطلب بزارید یا مثال