بستن پنجره
فرادرس - مجموعه آموزش‌های ویدئویی  مهندسی کامپیوتر - طراحی الگوریتم - ساختمان داده
بستن پنجره     از آخرین نوشته‌ها

»    مسابقه‌ی برنامه‌نویسی آنلاین 20 Quera

»    دوره‌ی طراحی و تحلیل الگوریتم دانشگاه استنفورد

»    مسأله‌ی انتخابات

بستن پنجره
وبگاه
این صفحه
اشتراک‌گذاری در LinkedIn     Cloob     اشتراک‌گذاری در Twitter
اشتراک‌گذاری در Facebook     ارسال با Telegram     Google Plus
بستن پنجره
وبگاه     این صفحه
اشتراک‌گذاری در LinkedIn     Cloob     اشتراک‌گذاری در Twitter     اشتراک‌گذاری در Facebook     ارسال با Telegram     Google Plus
کلاس‌های حافظه در ++C - الگوریتمستان
الگوریتمستان
2414.215.00
  »  

       

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

http://www.aachp.ir آنچه می‌خوانید ویراست جدید نوشته‌ای است که اولین بار با عنوان «کلاسهای حافظه» شهریور ماه 1385 از طریق وبگاه برنامه‌نویسی و طراحی الگوریتم (عنوان و طرح پیشین وبگاه الگوریتمستان) منتشر شده بود.


آنچه در این نوشته می‌خوانید:

زبان برنامه‌نویسی ++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();
10   func();
11   return 0;
12 }

      

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

      

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();
10   func();
11   func();
12 }

      

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

      

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;
    ...
};
  
10 int main() {
11   const MyClass sample;
12   sample.a = 1;  //  مجاز نیست
13   sample.b = 2;  //  مجاز است
14   ...
15 }

این نوشته آخرین بار در تاریخ مورد بازنویسی علمی قرار گرفته است.
نوشته‌های مرتبط
        معرفی انواع ظرف‌ها (نگهدارنده‌ها - containers) در زبان برنامه‌نویسی ++C
        آشنایی با مفهوم سربارگذاری عملگرها در زبان ++C
        معرفی فایل سرآیند algorithm از کتابخانه قالب استاندارد زبان برنامه‌نویسی ++C به همراه نمونه کد
        معرفی متغیرهای مرجع در زبان برنامه‌نویسی ++C و آشنایی با مهمترین کاربردهای آنها
        آشنایی با حلقه‌های تکرار در زبان برنامه‌نویسی ++C و دستورات کنترلی مورد استفاده در آن
        آموزش استفاده از آرایه‌ی پویای دو بعدی در زبان ++C
        پنج نکته‌ی آموزنده در مورد برنامه‌نویسی به زبان برنامه‌نویسی ++C
        آشنایی با مفهوم و عملکرد اشاره‌گرها در زبان برنامه‌نویسی ++C و ارائه مثالهایی از کاربرد آن
        آشنایی با توابع دوست کلاس در زبان برنامه‌نویسی ++C و کاربرد آنها در سربارگذاری عملگرها
        آشنایی با قالب‌ها به عنوان یکی از امکانات متمایز ++C از C
پیوند کوتاه صفحه دسته‌بندی
امتیاز نوشته
  • 1
  • 2
  • 3
  • 4
  • 5
ارسال پیام

نام: *  

پست الکترونیک:

وبگاه:

متن پیام: *

right 01 02 03 04 05 06 07 08 09 10 11 12 13 14 left

 


» عgd

چهارشنبه، ۸ دی ماه ۱۳۹۵، ساعت ۱۴:۴۷
عالی بود خصوصا مثالاش

» علی

شنبه، ۸ خرداد ماه ۱۳۹۵، ساعت ۲۰:۲۵
خوب بود

» مهدی

چهارشنبه، ۱۹ اسفند ماه ۱۳۹۴، ساعت ۱۳:۳۹
char  هشت بیتی داره ولی این برا کاراکتر مگه نیست، این نوع که متغییر عدد صحیح نیست که
و در ضمن byte رو نداره07

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


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


چهارشنبه، ۱۹ اسفند ماه ۱۳۹۴، ساعت ۱۹:۵۷
مسعود:
char همون عدد صحیح یک بایتی هست. فقط نمود کاراکتری هم داره. برای همینم unsigned هم داره. راحت می‌تونید به عنوان عدد یه بایتی ازش استفاده کنید.

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

» مهدی

سه‌شنبه، ۱۸ اسفند ماه ۱۳۹۴، ساعت ۲۲:۴۱
سلام دوباره04
داداش یه سوال
تعریف متغیر جدید در C++ یا C به چه صورته؟10
من میخوام یه متغییر 8 بیتی از نوع صحیح(INT) درست کنم چون کامپایلری که استفاده میکنم همچین متغییری نداره و چون من برا میکروکنترلر ها برنامه مینویسم و در یه کتابخونه حدود 98 تا متغییر 8 بیتی لازم دارم، و کامپایلری که من استفاده میکنم فقط متغییر 16 بیتی از این نوع(int) داره و اگه بخوام 98 تا متغییر 16 بیتی داشته باشم کل حافظه میکروکنترلر من اشغال میشه الکی، خواستم راهنماییم کنی(کتابی، لینکی و... بهم معرفی کنی یا خودت اگه وقت داری...)
منتظر راهنماییت هستم08


چهارشنبه، ۱۹ اسفند ماه ۱۳۹۴، ساعت ۱۲:۰۷
مسعود:
این کامپایلر متغیر char یا byte نداره؟ این تعریف‌ها یه بایتی هستن.

» مهدی

یکشنبه، ۹ اسفند ماه ۱۳۹۴، ساعت ۰۰:۳۱
سلام/ممنون از شما/مطلب خوبی بود انسافا
یه سوال : این متغیر ها رو از کلاس دیگه هم میشه با تعریف یه شی از اون کلاس به صورت مستقیم به متغییر های سراسریش دسترسی یدا کرد، حالا چه نیازی هستش به 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/

» Mahdi

سه‌شنبه، ۱۵ بهمن ماه ۱۳۹۲، ساعت ۱۱:۵۸
تشکر.مطلبی ساده و بسیار مفهومی بود.

» عبدالرحمن

دوشنبه، ۱۱ آذر ماه ۱۳۹۲، ساعت ۲۱:۵۵
سلام چند روزی است که با حل یک مساله برنامه نویسی مشکل پیدا کردم  اگه می تونین کمک کنین ممنونم

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

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

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

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

    2

    4 5

    2 1

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

    128205
    0


» مهدی

سه‌شنبه، ۲۹ اسفند ماه ۱۳۹۱، ساعت ۱۹:۵۵
ممنون، عالی بود01

» نادر

چهارشنبه، ۷ دی ماه ۱۳۹۰، ساعت ۱۰:۴۸
تعریف کلاس صف در c++
باتشکر

» parvin

شنبه، ۲۰ فروردین ماه ۱۳۹۰، ساعت ۱۰:۱۱
salam khaste nabashid
ye soal dashtam az khedmate u
فرق بين متغيير خارجي با متغيير عمومي چيست؟
ممنون ميشم هرچه سريعتر جواب بديد.


شنبه، ۲۰ فروردین ماه ۱۳۹۰، ساعت ۱۹:۳۲
مسعود:
متغیر عمومی در خارج از هر تابعی معرفی شده و در دسترس تمام توابع همون فایل هست. اگر بخوایم از این متغیر در فایل دیگه‌ای از پروژه استفاده کنیم باید اون رو با عنوان خارجی در این فایل هم معرفی کنیم. در بالا این روش توضیح داده شده.