PDA

View Full Version : سیاست جاوا در نگهداری اشیا !



majno0n
دوشنبه 03 تیر 1392, 14:12 عصر
دوستان سلام http://ashiyane.org/forums/images/smilies/smile.gif

من تازه شروع به یادگیری برنامه نویسی جاوا کردم . یک سوال داشتم ! مزیت اینکه تو جاوا هر object تو heap قرار میگیره و refrence به اون object در stack قرار میگیره , نسبت به اینکه خود object تو stack قرار بگیره (یعنی اتفاقی که تو ++C میفته) چیه ؟ لطفا قانع م کنین
تشکر :)

cups_of_java
دوشنبه 03 تیر 1392, 15:01 عصر
موضوع استک و هیپ، موضوع جاوا یا یه زبان مشخص نیست! موضوع کلی توی همه زبان های برنامه نویسیه! و توی سی پلاس پلاس هم هست. با این تفاوت که توی سی پلاس پلاس انتخاب دست برنامه نویسه و باز تره اما توی جاوا انتخابی وجود نداره و فقط تو همون حالتی که خودت گفتی محدود شده (برای امن تر و ساده تر شدن کد برنامه نویس)
اما استک و هیپ!
اینا دو نوع حافظه متفاوت با امکاناتی متفاوت هستن:
استک حافظه ای به نسبت محدود، استاتیک و سریع هستش که توسط کامپایلر مدیریت میشه و در زمان اجرا به طور اتوماتیک به متغیر ها اختصاص و بازپس گیری میشه!
هیپ حافظه ای پویا و بزرگ تر هست، که توسط کامپایلر مدیریت نمیشده از قدیم و کنترلش دست خود برنامه نویس هستش! (اگر آشغال جمع کن رو در نظر نگیریم)
هیپ پویاست به این معنی که اگر میزان حافظه ای که متغیر برنامه شما می خواد در زمان کامپایل معلوم نباشه و در زمان اجرا معلوم شه که شی شما چقدر بزرگ خواهد بود و چه فدر فضا میخواد دقیقن، باید توی هیپ (با اپراتور new) براش حافظه در زمان اجرا گرفته بشه! (کامپایلر نمی تونسته در زمان کامپایل در استک براش حافظه بگیره)
پس به دو دلیل ما از new استفاده میکردیم در سی پلاس پلاس:
یکی معلوم نبودن اندازه شی در زمان نوشتن کد!
دو نیاز به طولانی بودن عمر استفاده از شی (بین فراخوانی های متد های مختلف) و استفاده نکردن از متغیر های Global

یه مثال ساده میزنم توی سی پلاس پلاس (به صورت شبه کد)

حالت استاتیک که تعداد از قبل مشخصه:
int i = 5;
Student [i] s;
s = ....;

حالت پویا که تعداد در زمان اجرا از فایل خونده میشه و نمی دونیم چقدر حافظه خواهد خواست:
int i;
i = read_from_file();
Student [] s = new Student[](i);
// اینجا شما نمی تونستی بنویسی Student[i] s;





برنامه نویسا وقتی تجربه کردن که در اکثر موارد توی برنامه های کاربردی باید از هیپ استفاده کنند، این موضوع رو توی طراحی جاوا به طور پیش فرض دراوردن. مسئله مدیریت حافظه به جرعت مهم ترین و مشکل ترین دغدغه برنامه های سی پلاس پلاس بوده همیشه.

DigitalRain
پنج شنبه 06 تیر 1392, 18:27 عصر
حالت پویا که تعداد در زمان اجرا از فایل خونده میشه و نمی دونیم چقدر حافظه خواهد خواست:
int i;
i = read_from_file();
Student [] s = new Student[](i);
// اینجا شما نمی تونستی بنویسی Student[i] s;

جواب خیلی عالی و کاملی بود تیپ جوابای StackOverFlow! یه نکته‌ی کوچیکی رو اضافه کنم که کامپایلر MSC++ این جالت رو ساپورت نمی‌کنه(آرایه ای با طول پویا) اما کامپایلر GNU ساپورت می‌کنه و البته حتما در هنگام کامپایل کد رو به همون صورت پویا ترجمه می‌کنه

cups_of_java
پنج شنبه 06 تیر 1392, 19:39 عصر
ممنونم از انرژی مثبتت.
من این چیزی که شما میگی رو نمی دونم اما فرضن حرفت درست باشه، کامپایلر زمان کامپایل باید فضای استک رو به اندازه سایز متغیر ها bind کنه، بنده خدا چطور میخواد فضا بگیره براش؟ با خودت به این فکر کردی؟ میشه لینکی بدی که اصل ماجرا ببینیم چی بوده؟

DigitalRain
یک شنبه 09 تیر 1392, 02:15 صبح
ممنونم از انرژی مثبتت.
من این چیزی که شما میگی رو نمی دونم اما فرضن حرفت درست باشه، کامپایلر زمان کامپایل باید فضای استک رو به اندازه سایز متغیر ها bind کنه، بنده خدا چطور میخواد فضا بگیره براش؟ با خودت به این فکر کردی؟ میشه لینکی بدی که اصل ماجرا ببینیم چی بوده؟
طبق تجربه گفتم٬ شاید منظورم رو درست نرسونده باشم٬ فکر می‌کنم وقتی همچین کدی رو به GCC می‌دیم:

int i = some_value;
int array[i];

تو مرحله‌ی پیش‌پردازش یا شاید کامپایل تبدیلش می‌کنه به معادل mallocایش و بی ارور کامپایل می‌کنه٬ اما ویژوال استودیو ارور می‌گیره

cups_of_java
یک شنبه 09 تیر 1392, 09:43 صبح
خوب این همون مثال شماره یک منه،‌ اونجا هم من از i استفاده کردم،‌ فقط یه اشتباه تایپی داشتم. تو این مورد ها مقدار در زمان کامپایل از طریق متغیری که مقدار داره معلومه
اما حالت دوم امکان پذیر نیست. (مثلن اگر شما i رو مساوی some_value نمیزاشتی کامپایلر error‌ باید میداد،‌ حالا هر کامپایلری که باشه)