رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
فرهاد شیری

تعریف متغیرهای استاتیک در Template Function


پست های پیشنهاد شده

با سلام 

همانطور که می دانید وقتی یک متغیر کلاس اتوماتیک را به صورت استاتیک در بدنه یک تابع تعریف میکنید و درصورتی که این تابع به صورت external تعریف شده باشه، قطعا با هر بار فراخوانی این تابع مقدار متغیر استاتیک فقط یکبار در اولین فراخوانی مقدار دهی خواهد شد و در فراخوانی های بعدی آخرین مقدار خود را حفظ خواهد کرد. 

بنابراین نکته ای که میتونه خیلی کاربردی باشه این هست که رفتار کامپایلر با متغیرهای استاتیک درون یک تابع template براساس آرگومان template تابع متفاوت خواهد بود، یعنی کامپایلر نوع استاتیک را براساس نوع آرگومان تابع template تعیین میکند و در section .rodata چندین نگارش از متغیر استاتیک را می نویسد، پس نتیج میگیرم که متغیرهای استاتیکی که در بدنه یک تابع template تعریف شده اند برای تابع یکتا نیستند و مقادیر مختلفی برای تابع ساخته شده است.

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

با توضیحاتی که ارائه شد به مثال زیر توجه کنید...

template <typename T> void ef1() {
  static int stat = 0;
  std::cout << stat++;
};

و اگر من دستورات زیر را فراخوانی کنم...

ef1<int>();
ef1<int>();
ef1<int>();

با اجرای کد بالا قطعا مقادیر خروجی 012 را خواهم داشت.

ولی اگر از دستورات زیر استفاده کنم...

ef1<int*>();
ef1<int*>();

شاید انتظار داشتید که خروجی برنامه بعد از اجرای دستورات بالا مقدار 34 را نمایش میداد ولی خیر خروجی برنامه 01 خواهد بود.

ویا اگر...

ef1<int&>();
ef1<int&>();

بازهم خروجی 01 خواهد بود.

ویا حتی اگر...

ef1<const int>();
ef1<const int>();

وبازهم خروجی 01 خواهد بود.

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

البته یک نکته ای که زبانی سی++ را از سایر زبانها متمایز میکند، همین تکنیک هست که به لطف وجود همچنین تکنیکی شما امکان طراحی یک کلاس template که به صورت singletone باشد را خواهید داشت، یعنی کلاسی که برای انواع آبجکتهای شما یک رفرنس یکتا ایجاد کند تا مجبور نباشید که برای هر آبجکتی که قصد استفاده از الگوی singletone را برایش داشتید جداگانه یک کلاس بنویسید.

به همین علت هست که زبانهای مثل جاوا ویا سی شارپ امکان ایجاد یک کلاس ژنریک سینگلتون را ندارند.! (البته در زبان سی شارپ می توان کلاس ژنریک سینگلتون تعرف کرد ولی به علت قوانین مدیریت حافظه ای که در سی شارپ وجود دارد، نمی توان تضمین کرد که یک کلاس ژنریک سینگلتون واقعا به یک کپی اشاره داشته باشد.) 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...