PDA

View Full Version : سوال: تخصیص حافظه هنگام کامپایل؟ زمان اجرا؟



...StacK...
شنبه 12 بهمن 1387, 15:18 عصر
سلام -به قطعه کد زیر نگاه کنید:


int x=788;//تخصیص حافظه هنگام کامپایل
int *y= new int(9999);//تصیص حافظه در زمان اجرا

وقتی میگیم حافظه زمان کامپایل تخصیص داده میشه یعنی وقتی کد را کامپایل میکنیم

این حافظه از سیستم اخذ میشه و به برنامه کامپایل شده ما تخصیص داده میشه

حتی زمانی که برنامه در حال اجرا نیست؟؟؟؟؟؟؟ این تعریف من درسته یا نه؟؟؟؟

یعنی اگر من یک ارایه چند بعدی با حافظه 20 mb در برنامه استفاده کنم

حجم برنامه من ایقدر افزایش پیدا میکنه؟؟؟؟

=================================================

تخصیص حافظه زمان اجرا:

یعنی اینکه وقتی برنامه رو اجرا کردیم حافظه مورد نظر اخذ میشه و مورد استفاده قرار میگیره

؟؟؟؟؟درسته؟؟؟؟

Mehdi Asgari
شنبه 12 بهمن 1387, 16:30 عصر
وقتی میگیم حافظه زمان کامپایل تخصیص داده میشه یعنی وقتی کد را کامپایل میکنیم
این حافظه از سیستم اخذ میشه و به برنامه کامپایل شده ما تخصیص داده میشه
درسته

حتی زمانی که برنامه در حال اجرا نیست؟؟؟؟؟؟؟
خودت داری میگی "تخصیص در زمان اجرا". تا وقتی که برنامه ات اجرا نشه هیچ قسمتی از حافظۀ سیستم رو اشغال نخواهد کرد (فقط حجمی رو روی هارد دیسک یا هر نوع رسانۀ ذخیره سازی دیگه که روش هست اشغال می کنه)


یعنی اگر من یک ارایه چند بعدی با حافظه 20 mb در برنامه استفاده کنم
حجم برنامه من ایقدر افزایش پیدا میکنه؟؟؟؟

دقیقا نمی تونی بگی چقدر (مگر با استفاده از ابزار profiling) ولی به تقریب میشه گفت که بله ، اگه شما در زبانی مثل سی پلاس پلاس که مدیریت خودکار حافظه و GC نداره ، در صورت استفاده از مثلا یک آرایۀ 20 هزار تایی از مثلا char ، 20 کیلوبایت به Working Set (مقدار حافظۀ مصرفی برنامه در حال اجرا) اضافه خواهد شد.

حجم برنامه من ایقدر افزایش پیدا میکنه؟؟؟؟
حجم برنامه ات نه ، میزان حافظۀ مصرفیش

...StacK...
شنبه 12 بهمن 1387, 17:59 عصر
پس در هر دو مورد تخصیص حافظه زمان کامپایل و زمان اجرا تخصیص حافظه در زمان اجرای برنامه

انجام خواهد شد با این تفاوت که در زمان کامپایل حافظه تخصیص داده شده و تا اخر اجرای برنامه

باقی خواهد ماند ....اما در تخصیص زمان اجرا برنامه نویس میتواند به طور دلخواه در جریان برنامه حافظه

را تخصیص داده و ازاد کند....

اگر این برداشتم هم مشکل داشت اصلاح کنید مشکلم را و الا ممنون از شما استاد عزیزم.

emad_67
شنبه 12 بهمن 1387, 18:34 عصر
وقتی میگیم حافظه زمان کامپایل تخصیص داده میشه یعنی وقتی کد را کامپایل میکنیم

این حافظه از سیستم اخذ میشه و به برنامه کامپایل شده ما تخصیص داده میشه
به نظرم این حرف غلطه، کامپایلر تخصیص حافظه انجام نمیده، فقط در زمان کامپایل مقدار حافظه ای رو که برنامه برای اجرا نیاز داره رو محاسبه می کنه و در زمان اجرا این مقدار حافظه تخصیص داده میشه.
جناب mehdi311ggg (http://barnamenevis.org/forum/member.php?u=12705) این جمله رو تایید کردن ولی بعدش گفتن:

تا وقتی که برنامه ات اجرا نشه هیچ قسمتی از حافظۀ سیستم رو اشغال نخواهد کرد
که من درست نفهمیدم منظورشون چیه؟

Mehdi Asgari
شنبه 12 بهمن 1387, 20:59 عصر
در یک برنامه چندین نوع داده باید ذخیره بشن. داده ها (متغیر های سراسری ، ...) ، کد ، قسمتی برای پشته (برای فراخوانی توابع و ...) ، heap (برای حافظۀ پویا) ، ...
سایز کد که موقع کامپایل برنامه معلومه ، سایز داده ها هم همینطور. پشته و heap موقع اجرای برنامه است که معنی دارن و به درد می خورن (وگرنه یه فایل exe که در جایی روی هارد یا فلش مموری ذخیره شده فقط از دو بخش .text برای کد و .data برای داده ها تشکیل میشه (و بخش های دیگه که فعلا بی خیالشون میشیم))
خب تا وقتی که برنامه اجرا نشده ، حافظۀ سیستم (رم) اشغال نخواهد شد. پس از اجرای برنامه وقتی از قسمت code مثلا یه خطی رو اجرا می کنیم که در اون یک متغیر معمولی از نوع int تعریف شده ، این متغیر در پشته دخیره میشه. اما اگه بخوایم حافظه رو به صورت پویا اختصاص بدیم (با malloc یا new) اون وقت اشاره گر ها و داده ها بر روی heap قرار می گیرن.معمولا داده هایی که روی پشته قرار می گیرن طول عمری برابر تابعی دارن که توش تعریف شدن (یعنی با از بین رفتن اون تابع اینا هم از بین میرن) اما متغیر های heap اگه باهاشون کاری نداشته باشی همچنان روی حافظه باقی ان. برای همین در زبان هایی مثل سی و سی پلاس پلاس که مدیریت خودکار حافظه ندارن اگر داده ای رو روی heap ایجاد کردی ، باید بعدا (پس از اتمام کارت باهاش) از بین ببریش تا بتونی حافظه اش رو دوباره استفاده کنی (توسط free و delete)
برای آنالیز یک فایل که هنوز اجرا نشده (static analysis) باید از ابزاری مثل دیس اسمبلر و PE Info و ... استفاده کنی تا بتونی سکشن های مختلفش رو ببینی. برای مشاهده و پیگیری حافظۀ تخصیصی در زمان اجرای برنامه باید از ابزاری به نام Profiler (http://en.wikipedia.org/wiki/Profiler_(computer_science))استفاده کنی
این کتابا رو یه نگاه بنداز ، به دردت می خورن:
Memory Management: Algorithms and Implementation in C/C++ (http://www.amazon.com/Memory-Management-Implementations-Programming-Development/dp/1556223471)
کامپایلر Aho (http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811)
Memory as a Programming Concept in C and C++ (http://www.amazon.com/Memory-Programming-Concept-C/dp/0521520436) (اینو خودم نخوندم هنوز)

که من درست نفهمیدم منظورشون چیه؟
واضحه. تا وقتی برنامه ای اجرا نشه حافظه اشغال نخواهد کرد (حافظۀ اصلی کامپیوتر که همانا رم باشد). فقط یک فضای ثابتی رو در هارد دیسک (یا فلش مموری یا ...) اشغال می کنه و هر دفعه برای اجرا اون فایل رو load می کنیم به حافظۀ اصلی سیستم

cups_of_java
پنج شنبه 17 بهمن 1387, 20:07 عصر
پس در هر دو مورد تخصیص حافظه زمان کامپایل و زمان اجرا تخصیص حافظه در زمان اجرای برنامه

انجام خواهد شد با این تفاوت که در زمان کامپایل حافظه تخصیص داده شده و تا اخر اجرای برنامه

باقی خواهد ماند ....اما در تخصیص زمان اجرا برنامه نویس میتواند به طور دلخواه در جریان برنامه حافظه

را تخصیص داده و ازاد کند....

اگر این برداشتم هم مشکل داشت اصلاح کنید مشکلم را و الا ممنون از شما استاد عزیزم.


در راستای حرف های کامل مهدی جان، این رو فقط اضافه کنم:

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