PDA

View Full Version : سوال: چه زمانی بهتر است توابع را بصورت Inline تعریف کنیم؟



sadeghlinux
دوشنبه 02 آبان 1390, 01:56 صبح
سلام دوستان

چند تا سوال داشتم

1-چه زمانی بهتر است توابع را بصورت Inline تعریف کنیم؟
2-زمان کامپایل برنامه بدون استفاده از تابع و نسبت به همان برنامه با استفاده از تابع چه فرقی می کنه؟
3-تمامی فرق های Cin و cin.get() ؟
4-بین نوع متغیر و اشارگری که به آن اشاره می کند چه اتفاقی می افتد؟

دوستان خواهشا راهنمایی کنید

با تشکر از همه

rezaricky
سه شنبه 03 آبان 1390, 00:16 صبح
1-در توابع کوچکی که زیاد از انها استفاده می شود میتوان برای بهبود سرعت اجرای برنامه از توابع inline استفاده کرد.
2-نفهمیدم چی گفتی
3-cin برای گرفتن داده ورودی از هر نوعی مانند int ,char,float استفاده میشه اما cin.get فقط برای گرفتن رشته بکار میره
4-اشاره گر یک نوع متغیر است که ادرس یک متغیر دیگر را در خود ذخیره می کند

Cyletech
چهارشنبه 16 آذر 1390, 16:33 عصر
می تونید لطفاً در مورد توابع inline توضیح دهید؟ چیزی که من فهمیدم این هست که توابع کوچکی که زیاد استفاده میشه باید inline تعریف بشه تا کامپایلر دیگه واسه دسترسی به اون تابع هی پرش نکنه و اون تابع رو در همونجا که قرار داره میگذاره . ولی من بیشتر میخوام بدونم. مثلاً چه اتفاقی میافته اگر اون توابع کوچیک رو inline تعریف نکنیم و چه اتفاقی دقیق میافته وقتی inline تعریف میشه. ممنونم

soorena
چهارشنبه 16 آذر 1390, 17:45 عصر
سلام

اگر احساس می‌کنید که میدونید کی‌ و کجا از توابع استفاده کنید که چه خوب ولی‌ این رو بگم که کامپایلر‌های امروزی حالا بسته به نوع کامپایلر خودشون تا جای ممکن بهینه سازی رو انجام میدان و اگر لازم باشه از توابع inline هم استفاده می‌کنن رو همین حساب فعلا شما خودتون رو درگیر این مسائل نکنید. کامپایلر‌هایی‌ مثل intelc بسیار به صورت بهینه شده کامپایل می‌کنن طوری که سرعت اجرای برنامه با این کامپایلر‌ها بسیار خوب هستش البته gcc هم خیلی‌ خوب هستش و فرقش اینه که مجانی‌ هم هستش.(بر عکس intelc که پولی‌ هستش.)
از همه اینها که بگذریم هر بار پرش کردن به یک تابع خوب وقت برنامه رو میگیره و سرعت اون رو پایین میاره خوب علت هم واضح هستش چون هر پرش نیز به ذخیره سازی تعدادی متغیر و رجیستر داره. برای همین توابع کوچیک رو به صورت inline مینویسن.خوب اگه ننویسن هم که توضیح دادم کامپایلر خودش در صورت تشخیص این کار رو می‌کنه.

Cyletech
چهارشنبه 16 آذر 1390, 19:40 عصر
ممنونم دوست خوبم. من برنامه نویس تازه وارد نیستم ولی تازه با c++ دارم کار می کنم و مشکلی در فهم مطالب ندارم. من از کامپایلر Code::Blocks استفاده می کنم. کلاً وقتی با من حرف می زنی مجوز GPL (متن باز) یادت بیاد :D بنظرتون حالا این که استفاده می کنم بهتره یا gcc ؟!
و البته اینم ذکر کنم برنامه نویس باید همه راه ها رو بدونه و خودش بهینه ترین راه رو تشخیص بده. کامپایلر هم بهینه کنه دیگه چه بهتر.

rezaricky
جمعه 18 آذر 1390, 02:29 صبح
سلام دوست عزیز
code::blocks کامپایلر نیست بلکه یک IDE هست که از کامپایلر gcc بعنوان کامپایلر استفاده می کند،یعنی شما همین الان هم دارین از کامپایلر gcc استفاده می کنید( کامپایلر gcc اسمش تو ویندوز MinGW هست)
موفق باشین

developing
شنبه 19 آذر 1390, 11:25 صبح
با سلام

در ادامه ي توضيحات دوستمون(rezaricky (http://barnamenevis.org/member.php?145434-rezaricky)) در بخش 3 بگم:
هنگام گرفتن مقادير رشته اي
در تابع cin نمي تونيم فاصله رو به عنوان بخشي از رشته داشته باشيم
ولي در تابع cin.get مي تونيم فاصله رو هم به عنوان بخشي از رشته دريافت كنيم.

در مورد توابع inline :
وقتي يه تابع به صورت معمولي فراخواني مي شه آدرس برگشت،‌ پارامترها و چيزهاي ديگه اي كه تابع به اونها در زمان بازگشت احتياج داره در زمان فراخواني داخل پشته ذخيره مي شه. بعد يه پرش به آدرس تابع داريم پس از انجام كارهاي تابع به آدرس برگشت مي رسيم كه باز يه پرش ديگه و واكشي از پشته اينا همه زماني رو از پردازنده مي گيره كه وقتي تابع inline مي شه همه ي اين آدرس ها و پارامترها و موقعيت هاي جانبي حذف مي شه در نتيجه در اجراي اون بخش از برنامه افزايش سرعت چشمگيري را داريم.
يادم نره بگم تابع در صورتي كه فراخواني هاي زيادي داشته باشه حجم كدتون!!! هم زياد مي شه در صورتي كه تابع inline بشه. كه البته براي سيستم عامل ها و استفاده در سيستم هاي خانگي مشكل نخواهيد داشت ولي براي استفاده در يك ميكرو بسياري حياتي ميشه.

البته اين رو هم در نظر بگيريم كه بسياري از كامپايلرهاي نوين به قول دوستمون تمام اين كارها رو براي بهينه شدن برنامه به صورت خودكار انجام مي دن.