نقل قول نوشته شده توسط farhad_shiri_ex مشاهده تاپیک
اول شما مشخص نکردید که برای چه معماری برنامه مینویسید؟ MISC or SISC
بنابراین من فرض میگرم شما برای پردازشگرهای MISC برنامه می نویسید

زمانی که تابع فوق را به این صورت فراخوانی میکنید، کامپایلر برای رشته "salam" یک آفست آدرس تولید میکنه که این آفست آدرس را در محل آفست آدرس اشاره گر *char قرار میده، و وقتی شما از یک مقدار temporary که توسط کامپایلر ایجاد شده جهت استفاده از رشته salam استفاده میکنید بنابراین برای بار دوم هم کامپایلر مجدد این آدرس افست را ایجاد میکنه با اینکه ظاهرا رشته تکراری هستش با اینکه ظاهرا شما در یک حوزه دید از این دوتابع استفاده کردید.
پس مدیریت stack frame تابع به عهده کامپایلر هستش، برای اینکه بخواهید از یک حافظه کمتر استفاده کنید...
1- رشته salam را در یک متغیر صریح مقدار دهی کنید، تا اینطوری کامپایلر فقط یک آفست آدرس ایجاد کنه
2- در معماری که برنامه مینویسید براساس 16 , 32 , 64 حتما توجه کنید که طول رشته ثابت را ضریبی از مقدار بیت های معماری در نظر بگیرید تا اینطوری از هدر رفتن حافظه جلوگیری کنید، به عنوان مثال اگر 32 بیت کار میکنید سعی کنید طول رشته ثابت قابل تقسیم شدن به 32 باشه الان رشته salam + null pointer میشه 6 که تقریبا 2 بایت هدر رفت حافظه داریم( حالا چرا چون آدرس های حافظه در معماری 32 بیتی باید ضریبی از 32 باشند به همین علت کامپایلر برای آدرس دهی 6 بایت از 2 آدرس 4 بایتی استفاده میکنه)

در ضمن استفاده از حافظه هیپ هم کندتر از stack هستش به همین علت اگر اندازه آرایه رشته ای را از ابتدا به درستی تعیین کنید هم سرعت بیشتری خواهید داشت وهم هدر رفت حافظه ای کمتری خواهید داشت
از معماری RISC استفاده میکنم.
توی این انجمن عجب برنامه نویسایی داریم آدم لذت میبره، توضیحات شما خیلی عالی بود
------
1- تنها راه حذف این حافظه temporary پس از استفاده خروج از تابع هستش؟
2- راهی هست که بشه از همون آدس افست قبلی دوباره استفاده بشه برای زمانی که چندین بار در یک تابع از تابعی مثل

send_str( “salam”, 5);

استفاده شده باشه؟

3- دوست عزیز میشه منبعی برای توضیح حافظه هیپ بهم معرفی کنی یا خودتون یه توضیحی بدید.

پیشاپیش متشکرم