PDA

View Full Version : گفتگو: تفاوت ارسال آرگومان از طریق مقدار با ارسال از طریق ارجاع ثابت در زبان های برنامه نویسی



Slytherin
جمعه 10 آذر 1391, 08:16 صبح
درود،
همه می دونیم که به سه طریق امکان ارسال آرگومان هایمان به توابع وجود دارد:
1.ارسال از طریق مقدار و مثلا در تابع داریم:
void Example(int);
در این حالت یک کپی از اطلاعات ارسال در حافظه به وجود می آید و هیچ تغییری روی آرگومان ما صورت نمیگیرد.
2.ارسال از طریق ارجاع و مثلا در تابع داریم:
void Example(int&);
در این حالت تابع به طور مستقیم با مقدار ارسالی کار میکند و در صورتی که تغییری در مقدار آرگومان صورت گیرد، در خارج از تابع هم اعمال می شود...
ولی حالت سومی نیز وجود دارد:
3.ارسال از طریق ارجاع ثابت و مثلا در تابع داریم:
void Example(const int&);
در این حالت با اینکه آرگومان ما از طریق ارجاع ارسال میشود ولی پس از اتمام کار تابع هیچ تغییری در مقدار اولیه به وجود نمی آید. (مانند حالت اول)
حالا با بیان این مقدمات این سؤال مطرح می شود که اگر حالت اول و حالت سوم هیچ تفاوتی از نظر عملکرد با یکدیگر ندارند، پس ما اصلا به چه دلیلی از حالت اول استاده می کنیم؟ با توجه به اینکه حالت سوم فضای کمتری (دقیقا نصف) در حافظه اشغال میکند اصلا چرا حالت اول در زبان های برنامه نویسی گنجانده شده است؟ آیا به غیر از میزان اشغال حافظه، پارامترهای دیگری هم مد نظر هستند که باعث بشوند تا به جای حالت سوم از حالت اول استفاده کنیم؟
حقیقتا این بحث دیروز در یکی از کلاس های درس توسط من مطرح شد و هیچ یک از اساتید و یا دانشجویان نتوانستند پاسخ دقیقی به این سؤال بدهند و تنها احتمالی که دادیم این بود که در حالت سوم احتمالا فشار بیشتری به پردازنده می آید و زمان بیشتری صرف ارسال و دریافت اطلاعات می شود...
شما چه فکری می کنید؟
لطفا اگر منبع خوبی در این رابطه دارید بهم معرفی کنید.
با تشکر از همگی

maktoom
جمعه 10 آذر 1391, 23:55 عصر
سلام
حقیقتش منم منتظرم از دوستان کسی به این سوال جواب بده.
آخه منم گشتم توی فرومای خارجی بیشتر این بحث شده که فرق بین static const int با const int چیه تا چیزی که دوستمون خواستن.

shahmohammadi
شنبه 11 آذر 1391, 13:16 عصر
سلام.

3.ارسال از طریق ارجاع ثابت و مثلا در تابع داریم:

void Example(const int&);

در این حالت با اینکه آرگومان ما از طریق ارجاع ارسال میشود ولی پس از اتمام کار تابع هیچ تغییری در مقدار اولیه به وجود نمی آید. (مانند حالت اول)در حالت سوم كدي مانند زير نادرسته چون شما اصلا حق تغيير مقدارشو نداريد.
مثلا كد زير نادرسته:
void Example(const int&a)
{
a=100;
}
خوب حالا همون طور كه مي‌بينيد روش اول هيچ شباهتي به روش سوم نداره.

Slytherin
پنج شنبه 16 آذر 1391, 17:48 عصر
سلام.
در حالت سوم كدي مانند زير نادرسته چون شما اصلا حق تغيير مقدارشو نداريد.
مثلا كد زير نادرسته:
void Example(const int&a)
{
a=100;
}
خوب حالا همون طور كه مي‌بينيد روش اول هيچ شباهتي به روش سوم نداره.

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