-
چهارشنبه 21 خرداد 1399, 13:30 عصر
#4
کاربر دائمی
نقل قول: یک راه حل در اشغال رم(ارسال رشته)
اول شما مشخص نکردید که برای چه معماری برنامه مینویسید؟ CISC or RISC
بنابراین من فرض میگرم شما برای پردازشگرهای CISC برنامه می نویسید
زمانی که تابع فوق را به این صورت فراخوانی میکنید، کامپایلر برای رشته "salam" یک آفست آدرس تولید میکنه که این آفست آدرس را در محل آفست آدرس اشاره گر *char قرار میده، و وقتی شما از یک مقدار temporary که توسط کامپایلر ایجاد شده جهت استفاده از رشته salam استفاده میکنید بنابراین برای بار دوم هم کامپایلر مجدد این آدرس افست را ایجاد میکنه با اینکه ظاهرا رشته تکراری هستش با اینکه ظاهرا شما در یک حوزه دید از این دوتابع استفاده کردید.(البته بدون در نظر گرفتن optimization کامپایلر ) پس مدیریت stack frame تابع به عهده کامپایلر هستش، برای اینکه بخواهید از یک حافظه کمتر استفاده کنید...
1- رشته salam را در یک متغیر صریح مقدار دهی کنید، تا اینطوری کامپایلر فقط یک آفست آدرس ایجاد کنه
2- در معماری که برنامه مینویسید براساس 16 , 32 , 64 حتما توجه کنید که طول رشته ثابت را ضریبی از مقدار بیت های معماری در نظر بگیرید تا اینطوری از هدر رفتن حافظه جلوگیری کنید، به عنوان مثال اگر 32 بیت کار میکنید سعی کنید طول رشته ثابت قابل تقسیم شدن به 32 باشه الان رشته salam + null pointer میشه 6 که تقریبا 2 بایت هدر رفت حافظه داریم( حالا چرا چون آدرس های حافظه در معماری 32 بیتی باید ضریبی از 32 باشند به همین علت کامپایلر برای آدرس دهی 6 بایت از 2 آدرس 4 بایتی استفاده میکنه)
در ضمن استفاده از حافظه هیپ هم کندتر از stack هستش به همین علت اگر اندازه آرایه رشته ای را از ابتدا به درستی تعیین کنید هم سرعت بیشتری خواهید داشت وهم هدر رفت حافظه ای کمتری خواهید داشت
آخرین ویرایش به وسیله farhad_shiri_ex : یک شنبه 22 تیر 1399 در 10:39 صبح
قوانین ایجاد تاپیک در تالار
- شما نمی توانید تاپیک جدید ایجاد کنید
- شما نمی توانید به تاپیک ها پاسخ دهید
- شما نمی توانید ضمیمه ارسال کنید
- شما نمی توانید پاسخ هایتان را ویرایش کنید
-
قوانین سایت