اطلاعیه

Collapse
No announcement yet.

"انواع کلاس ذخیره سازی" یعنی چی؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    "انواع کلاس ذخیره سازی" یعنی چی؟

    سلام به همه ی دوستان

    در حال مطالعه ی کتاب میکروکنترلر آقای جابر الوندی بودم که به این سر فصل رسیدم:

    انواع کلاس های ذخیره سازی ؟؟؟ :eek:

    لطفا خیلی ساده و روان برای این کمترین توضیحی ارائه کنید.

    سپاس

    #2
    پاسخ : "انواع کلاس ذخیره سازی" یعنی چی؟

    هر متغیری دارای دو ویژگی هست در C یکی نوع و یکی کلاس ذخیره سازی! نوع که همان char -int-floating point ... هست و کلاس ذخیره سازی نشان دهنده ی این هست که متغیر تا چه زمانی در دسترس خواهد بود
    مثلا کلاس auto که معمولا هم نوشته نمیشه همان متغیر محلی هست که داخل توابع به کار میره
    یا کلاس استاتیک که نوشته میشه و ...
    چهار نوع کلاس ذخیره سازی وجود داره.
    automatic
    external
    static
    register

    دیدگاه


      #3
      پاسخ : "انواع کلاس ذخیره سازی" یعنی چی؟

      نوشته اصلی توسط voyager2020
      هر متغیری دارای دو ویژگی هست در C یکی نوع و یکی کلاس ذخیره سازی! نوع که همان char -int-floating point ... هست و کلاس ذخیره سازی نشان دهنده ی این هست که متغیر تا چه زمانی در دسترس خواهد بود
      مثلا کلاس auto که معمولا هم نوشته نمیشه همان متغیر محلی هست که داخل توابع به کار میره
      یا کلاس استاتیک که نوشته میشه و ...
      چهار نوع کلاس ذخیره سازی وجود داره.
      automatic
      external
      static
      register
      میشه بگید مورد دوم و آخر چه تفاوتی با دو تای اول دارند؟
      و اینکه چرا نمیشه داخل آرگومان های ورودی تابع از مورد سوم استفاده کرد؟
      ممنون.
      ---------
      .
      .
      ...........

      دیدگاه


        #4
        پاسخ : "انواع کلاس ذخیره سازی" یعنی چی؟

        مورد اول که معمولا نوشته نمیشه و همون متغیر محلی هست

        مورد دوم هم همان متغیر گلوبال هست که توسط تمامی توابع قابل دسترسی هست

        مورد سوم وقتی مغیری در تابعی مقدار دهی میشه بعد از خروج از فضای تابع متغیر از بین میره و در کال بعدی ممکنه جای دیگری رو از رم اشغال کنه و مقدار دیگری داشته باشه که هیچ ربطی به مقدار قبلی نداره ولی در مواردی که نیاز هست تابع به صورت پشت سر هم کال بشه و مقدار قبلی متغیر حفظ بشه یک راهش استفاده از کلمه ی استاتیک هست تا مقدار قبلی تا "پایان اجرای برنامه" حفظ بشه- اگر استاتیک در ورودی های تابع باشه در واقع مثل دادن عدد ثابت به ورودی هست یعنی امکان تغییرش در داخل تابع نیست! البته این چیزیه که من فکر میکنم ولی اینم بگم که احتمالا با روشی امکان تعریفش هست ولی اینکه درست جواب بده یا نه تست نکردم
        مورد دیگه اینکه استاتیک فقط توسط اون تابعی قابل دسترسی هست که داخل اون تعریف شده نه مثل متغیر های گلوبال

        مورد چهارم هم همان مورد اول هست از لحاظ فضای دسترسی ولی با این تفاوت که در کامپایلر های قدیمی برای اینکه بشه یک متغیر رو در رجیستر های پرروسسور تعریف کرد از این کلمه استفاده میشد که اگر هم رجیستر خالی وجود نمیداشت از رم استفاده میکرد! یعنی اولویت با کامپایلر هست -تقریبا کامپایلر های امروز این کلمه رو نادیده میگیرند! و کاربردی نداره

        دیدگاه


          #5
          پاسخ : "انواع کلاس ذخیره سازی" یعنی چی؟

          با تشکر از voyager2020

          مطالبی در مورد کلاس ها خوندم شاید به درد شما هم بخوره ....

          //////////////////////////////////////////////////////////////////////////////////////////////

          کلاس های حافظه

          کلاس حافظه (storage class) تعیین می کند چگونه حافظه به متغیرها توسط کامپایلر واگذار شود. فضای حافظه برای ذخیره متغیرها و توابع و طول عمر این فضا در طول اجرای برنامه توسط کلاس حافظه مشخص می شود.

          محل ذخیره و محدوده متغیرها بسته به محلی (که می تواند داخل یا خارج بدنه تابع باشد) دارد که تعریف می شوند. وقتی پیش فرض های ذخیره سازی شما را راضی نمی کنند می توانید از کلاس های حافظه استفاده کنید.

          کلاس های حافظه در C و ++C عبارتند از:

          auto •
          register •
          static •
          extern •
          typedef •
          mutable •(تنها در ++C)
          auto

          اگر کلمه کلیدی auto را قبل از اعلان متغیری قرار دهید صریحا نوع ذخیره سازی اتوماتیک (automatic storage) را برای متغیر مدنظر گرفته اید. متغیری که ذخیره سازی اتوماتیک دارد با خروج از بلاکی که در آن تعریف شده پاک می شود. حافظه زمان ورود به بلاک اختصاص و زمان خروج از آن آزاد می شود.

          مثال. اعلان صریح یک متغیر اتوماتیک.

          auto int i;

          دسترسی به متغیر از طریق اسم آن است. بخشی از برنامه است که نام متغیر در آن قابل رویت است میدان یا حوزه (scope) نامیده می شود.

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

          کلاس auto برای متغیرهای محلی و درون بلاک نوع پیش فرض است و نیازی به ذکر کلمه auto نیست.

          نکته. کلاس auto را می توانید برای متغیرهای درون یک بلاک یا پارامترهای تابع اعمال کنید.
          نکته. با اشاره گرها می شود به متغیرهای محلی از خارج بلاک دسترسی پیدا کرد.
          نکته. اگر متغیر اتوماتیک مقداردهی اولیه نشود مقدارش نامعلوم خواهد بود. اگر یک مقدار اولیه تعیین کنید هر زمان که وارد بلاکی که متغیر در آن تعریف شده شود مقدار به متغیر تخصیص داده می شود.
          نکته. اگر از دستور goto برای پرش به بلوکی استفاده کنید متغیرهای اتوماتیک مقداردهی نمی شوند.
          نکته. اگر متغیری درون تابع بازگشتی اعلان شود در هربار فراخوانی تابع حافظه ایجاد و مقداردهی می شود.
          register

          ثبات ها حافظه هائی درون خود CPU هستند که داده آنها می تواند به سرعت دسترسی شود. معمولا کامپایلر تعیین می کند چه زمانی چه داده ای باید در ثبات ذخیره شود. با وجود این کلاس register این امکان را به برنامه نویس می دهد که به کامپایلر بگویید در صورت امکان متغیر اتوماتیکی را درون ثبات ذخیره کند.

          کامپایلر مجبور به اجرای این درخواست نیست زیرا اندازه و تعداد ثبات های موجود در سیستم محدود است و تعداد کمی از متغیرها می توانند حقیقتا در ثبات ها قرار گیرند. اگر کامپایلر ثباتی را اختصاص ندهد با متغیرثباتی مانند متغیر اتوماتیک برخورد می کند.

          مثال. اعلان متغیر از کلاس ثبات.

          register int var;

          نکته. متغیرهای ثباتی نوعی متغیر اتوماتیک محسوب می شوند.
          نکته. متغیرهای ثبات باید درون یک بلاک یا به صورت پارامتر تابع اعلان شده باشند.
          نکته. ذخیره سازی کلاس ثبات از نوع اتوماتیک است یعنی با ورود به بلاک ایجاد و در انتها از بین می رود.
          نکته. متغیرهای ثبات را می توان مقداردهی اولیه داد.
          نکته. در C اشاره گر به متغیر ثبات نمی توانید داشته باشید. اما C++ اجازه می دهد آدرس متغیر از نوع ثبات را بگیرید.
          نکته. کلاس ثبات را نمی توانید برای اشیای درون فضای اسمی استفاده کنید.
          static

          متغیرهایئی که با کلاس static اعلان می شوند طول عمر ذخیره ایستا (static storage duration) دارند. بدین معنی که حافظه ثابتی از زمان شروع اجرای برنامه به آنها اختصاص داده می شود و تا پایان اجرای برنامه آزاد نمی شود.

          مثال. اعلان و مقداردهی متغیری از کلاس ایستا.

          static int staticInt = 5;

          متغیرهای static به حیاط خود حتی بعد از خروج از بلاکی که در آن تعریف شده اند ادامه می دهند. بنابراین مقدار متغیر در تابع بین فراخوانی های مکرر همان تابع حفظ می شود.

          مثال. فرض کنید متغیر x در تابع ()f اعلان شده است که تا زمان اجرای برنامه باقی می ماند.

          #include <iostream.h>
          int f(void) {
          static int x = 0;
          x++;
          return x;
          }
          int main(void) {
          int j;
          for (j = 0; j < 5; j++) {
          cout << "Value of f(): " << f() << endl;
          }
          return 0;
          }
          چون x از نوع static است هربار صفر نمی شود، بلکه مقدار قبلی خود را در تابع حفظ می کند. خروجی برنامه به صورت زیر خواهد بود:

          Value of f(): 1
          Value of f(): 2
          Value of f(): 3
          Value of f(): 4
          Value of f(): 5
          نکته. متغیر static درون بلاک تنها یکبار مقداردهی می شود در حالیکه متغیر auto هربار که اجرا وارد بلاک شود مقداردهی می شود.
          نکته. اگر یک متغیر static صریحا مقداردهی نشود مقداراولیه صفر را می گیرد.
          نکته. کلاس static مادام العمر هستند اما مشابه auto می توان میدان آنها را محدود به بلاک کرد.
          نکته. کلاس static می تواند برای متغیرهای اتوماتیک و خارجی هم استفاده بشود.
          extern

          کلمه کلیدی extern برای توصیف متغیری است که خارجی تعریف شده است. متغیرهای خارجی بیرون از هر بلاکی درون یک فایل اعلان می شوند و می توانند خارج از فایلی که در آن تعریف شده است استفاده شوند.

          با کلاس extern متغیرها و توابعی را می توان تعریف کرد که در چندین فایل قابل دسترسی هستند.

          مثال. اگر برنامه شامل چندین فایل منبع file1.cpp، file2.cpp و file3.cpp باشد. متغیری که در فایل file1.cpp تعریف است در دو فایل دیگر همراه با کلمه extern باید ذکر شود تا قابل دسترسی باشد.

          حافظه چنین متغیرهائی زمان شروع اجرای برنامه اختصاص داده می شود و تا انتهای برنامه باقی می ماند. میدان متغیرهای خارجی سراسری است یعنی در کل متن فایل بعد از خطی که اعلان شده اند قابل دسترسی هستند.

          متغیرهای خارجی ممکن مانند متغیرهای اتوماتیک با یک مقدار ثابت مقداردهی شوند. مقداردهی در زمان کامپایل تنها یکبار وقتی حافظه اختصاص داده می شود انجام می شود.

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

          نکته. در اکثر کامپایلرها مقداراولیه صفر به متغیرهای خارجی داده می شود.
          نکته. اگر تابعی متغیرمحلی هم نام با خارجی داشته باشد درون تابع ارجاع به متغیر محلی خواهد بود.
          نکته. در عمل بهتر است کلیه اعلانات extern در یک فایل هدر جمع شده و فایل با راهنمای include# ضمیمه شود.
          نکته. در ++C اعلان خارجی نمی تواند در داخل کلاس ظاهر شود.

          typedef

          اعلان typedef به شما اجازه می دهد شناسه های خودتان را تعریف کنید که می توانند جای نوع داده نظیر int یا float را بگیرند. یک اعلان typedef محلی برای ذخیره نمی گیرد و نوع داده جدیدی نیست بلکه مترادفی برای انواع داده یا ترکیبی از آنهاست.

          Typedef بخاطر شباهت های گرامری در دسته شاخص های کلاس حافظه گروه بندی می شود.

          مثال. عبارت زیر LENGTH را مترادف با int اعلان می کند.

          typedef int LENGTH;
          LENGTH length, width, height;
          اعلان زیر معادل مثال قبل است:

          int length, width, height;

          مثال. اعلان یک ساختمان توسط typedef. متغیرهای chicken، cow، horse و whale از نوع ساختمان WEIGHT تعریف شده اند.

          typedef struct {
          int scruples;
          int drams;
          int grains;
          } WEIGHT;
          WEIGHT chicken, cow, horse, whale;

          مثال. یک کلاس توسط typedef بدون نام تعریف شده و یک نام مستعار Trees را گرفته. چنین کلاس هائی نمی توانند سازنده و مخرب داشته باشند. ()Trees نمی تواند سازنده برای کلاس باشد.

          typedef class {
          Trees();
          } Trees;
          mutable

          کلاس ذخیره mutable تنها روی اعضای داده ای یک کلاس می تواند اعمال شود و باعث می شود این اعضا حتی اگر در کلاس به صورت const تعریف شده اند قابل تغییر باشند.

          مثال. در این برنامه کامپایلر اجازه نمی دهد انتساب var2.y=2345 انجام بشود زیرا var2 به صورت یک ثابت تعریف شده است. اما var2.x=345 اجرا می شود چون A::x به صورت mutable اعلان شده است.

          class A {
          public:
          A() : x(4), y(5) { };
          mutable int x;
          int y;
          };
          int main() {
          const A var2;
          var2.x = 345;
          // var2.y = 2345;
          }
          نکته. کلاس mutable را نمی توانید همراه با static یا const اعلان کنید.


          ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

          دیدگاه

          لطفا صبر کنید...
          X