کد تخفیف برای تمام محصولات کارگاه پلاس: R5VYP5US

نکته ۹: نکات تعریف متغیر

بهتر است از چه نوع متغیر هایی بیشتر استفاده کنیم؟

این سوال یک سوال کلی است، اما پنج قانون در تعریف متغیر وجود دارد:

  • طول متغیر
  • محل متغیر
  • مکان قرار گیری متغیر در حافظه
  • بهینه سازی متغیر
  • محدودیت های دسترسی

طول متغیر

همیشه متغیری با کوچکترین طول ممکن استفاده کنید، اگر می دانید بزرگترین عددی که در متغیر تان ریخته خواهد شد ۱۰۰ است از متغیر ۳۲ بیتی استفاده نکنید. استفاده از یک متغیر ۸ بیتی برای این امر کافیست. یک برنامه نویس همیشه بزرگترین عدد را باید احتمال دهد ولی این به این امر نیست که هر چه طول متغیر بیشتر بهتر.

گاهی نیز برنامه نویسان برای سادگی، پیوسته همه ی متغیر ها را int تعریف می کنند که این عمل هم دو مشکل دارد: نکته ی ۷ به اضافه ی هدر رفت حافظه. پس کوچکترین نوع ممکن را در نظر بگیرید.

محل متغیر

متغیر محلی باشد یا عمومی (local or global)، فقط در صورتی از متغیر های global یا عمومی استفاده کنید که بخواهید مقداری ذخیره داشته باشید و در چند بخش مختلف از آن استفاده کنید در غیر این صورت متغیر های محلی در اولویت هستند.

     نکات:

  • همواره در استفاده از متغیر های محلی، مقدار دهی اولیه را هنگام تعریف انجام دهید.
  • متغیر های عمومی در فضای کلی حافظه قرار می گیرد.
  • متغیر های محلی در فضای stack قرار می گیرند.
  • پیشرفته: آرایه های محلی امکان ارجاع در return توابع را ندارند. چون در فضای Stack قرار گرفته اند و پس از ارجاع حافظه ی آن ها invalid خواهد شد.

مکان قرار گیری متغیر در حافظه

در کنترلر ها یک متغیر می تواند در انواع حافظه ها باشد، مانند:

  • رجیستر ها
  • flash
  • eeprom
  • فضای رم های داخلی
  • فضای رم های خارجی
  • فضاهای جانبی نظیر RTC ها

پیشرفته:

تعیین محل قرار گیری متغیر ها در هر کامپایلر کاملا متفاوت است. در برخی باید attribute تنظیم نمود، در برخی باید فایل Command ایجاد کرد و در برخی باید Scatter ساخت. اگر محل قرار گیری متغیر مشخص نشود کامپایلر یک فضا از فضاهای رم و یا رجیستر ها را به صورت خودکار با توجه به وضعیت optimization، اختصاص خواهد داد. پس درج این مورد در تعریف متغیرهای عمومی الزامی نیست (در برخی موارد بسته به نیاز می بایست درج نمود.)

بهینه سازی متغیر

کامپایلر متغیر شما را بهینه سازی کند یا خیر. برای عدم بهینه سازی می توانید از لفظ volatile استفاده کنید.

در یک توضیح بیشتر، متغیر های نوع volatile، در نقاطی استفاده می شوند که برنامه نویس از وجود برخی Resource ها اطلاع دارد و کامپایلر شناختی از وجود این منابع ندارد.

از این Resource ها می توان IO ها و رجیستر هایPeripheral  ها را نام برد. در این میان وقفه ها هم جزیی از این منابع هستند. لذا متغیر ها و یا اشاره گر هایی که در این بخش نیز استفاده می شوند باید از نوع volatile باشند.

در برنامه ای که نوشتم متغیری را volatile می کنم و یا اینکه عادی است، تاثیری روی برنامه ندارد، مشکل کجاست؟

مشکلی نیست، قراردادن volatile جهت رفتار بهینه سازی است، اگر کامپایلر هم اکنون متغیر شما را بهینه نمی کند لذا وجود volatile بی تاثیر است. (در این هنگام فقط به روان خوانی برنامه کمک می کند.)

ذکر این نکته نیز الزامی است که کامپایلر بسته به سطح optimization تعریف شده و یا نوع کامپایلر می تواند رفتار مختلفی در بهینه سازی داشته باشد، لذا برای اینکه درگیر وضعیت بهبود کد در کامپایلر ها نشوید از volatile در دسترسی به اینگونه منابع در برنامه ها استفاده کنید.

در برخی از کامپایلر ها، قید شده است که متغیر های نوع volatile در اسمبلر Atomic تعریف خواهند شد. (به نکته ی دسترسی همزمان مراجعه کنید.)

محدودیت های دسترسی

در C با لفظ static و در C++ با لفظ های private و public دیده می شود. اگر می خواهید متغیر تنها در فایل جاری قابل دسترس باشد می توانید از لفظ static در هنگام تعریف متغیر در زبان C استفاده کنید اینگونه دیگر هیچ دسترسی به آن از سایر فایل های C وجود نخواهد داشت.

لازم به ذکر است که تعریف static یک متغیر، اگر درون بلاک ها، مانند توابع، تعریف شود کامپایلر آن متغیر را درون حافظه Global قرار می دهد. این بدان معناست که مقدار این متغیر در رفت و آمد به این تابع حفظ می شود. (رفتاری مثل متغیر global)

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *