ورود

نسخه کامل مشاهده نسخه کامل : فرق این دو چیست؟



iranch
28-08-2013, 10:08
دروود

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این طور که مشخص هست در struct نمی شود به صورت صریح سازنده را صدا زد و مقدار بهش فرستاد....با این وضع قطعه کد دوم چطور مقدار گرفته؟ بیشتر دوست دارم بدونم چه اتفاقی داره میافته./....ممنون

عــــلی
28-08-2013, 11:52
بسم الله الرحمن الرحیم.
سلام:n18:.
سیستم دات نت واقعاً معرکست توی مدیریت حافظه.به این صورت که:
فرق این دو کد اینطور هست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خط اول بلافاصله وارد حافظه میشه و فضای مموری رو پر میکنه.اما خط دوم وارد حافظه نمیشه و فضای مموری رو اشغال نمیکنه.
قدرت این سیستم مدیریت حافظه به این صورت عمل میکنه که شما تا مغیر ها رو فراخوانی نکنید(برای بار اول) یا new نکنید فضایی از حافظه رو براتون در نظر نمیگیره.یعنی مقداری وارد حافظه نمیشه اما حتی اگه بهشون مقدار ندی ولی مقداری از اونا دریافت کنید چون برای اولین بار هست و در حافظه نرفته بلافاصله وارد حافظه میشه.
برای اینکه صحت این مطلب براتون روشن بشه این رو تست کنید:
150 یا 200 مگابایت فضای آرایه تعریف میکنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
میتونید توی تسک منیجر ببینید که چقدر نرم افزارتون فضای حافظه اشغال کرده.میبینید که چیزی رو اشغال نکرده.
اما به معض اینکه به اندازه 10 مگابایت از این دویست مگابایت رو get میکنید بلافاصله وارد حافظه میشه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال از تسکمنیجر مقدار حافظه اشغالی برنامه شما به اندازه ده مگابایت افزاریش پیدا میکنه.
اگر همه 200 یا 150 مگابایت رو فراخوانی کنید به اندازه همون در حافظه شما میره:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق و سربلند باشید در پناه حق:n16:.

Life24
28-08-2013, 12:40
اشتباه شد...

iranch
28-08-2013, 12:42
درووودبسیار عالی بود..چند مورد مبهم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بعد از کلمه new فورا حافظه تخصیص میده کامپایلر...constructor is invoked by the new operator immediately after memory is allocated for the new object

اما می فرمائید تخصیص نمیدهد تا زمانی که ازشون get کنیم. چون مقدار دهی اولیه نشده اند حافظه نگرفته اند؟ و زمانی که get کردیم چون مقدار داده میشه بهشون ان وقت حافظه میگیرند؟
اما من این طور فهمیدئم که هر وقت کلمه new آمد سریعا حافظه گرفتن شروع میشه
2-آخه برای نوع مقدار که int و .. این چیزا باشه چون از نوع ساختار هست اگر کلمه new براش به کار بردیم.همان لحظه با مقادیر پیش فرض مقدار دهی اولیه می شوند. یعنی مثال شما با 0

3-در رابطه با int i=5 چطور؟ در اصل ساختار پشت پرده struct چطور پیاده سازی شده که 5 رو انتصاب میده به i بدون new ?

عــــلی
28-08-2013, 13:07
بسم الله الرحمن الرحیم.
سلام.
دقت کنید منظور از مقدار دهی این نیست که اشاره گر آرایه در حافظه نرفته باشه.نه.منظور مقادیر داخل آرایه هست که تا مقدار بهشون set یا ازشون get نکنی حافظه ای براشون در نظر نمیگیره.
int i = 0 فرقی با int i = new int() نداره.

برای اینکه متوجه بشید که ساختار int = 1 چطور پیاده سازی شده اند یا کلاستون رو اینطور بسازید باید از oprator ها استفاده کنید میتونید کلاس زیر رو تست کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اینطور بهش مقدار بدید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق و سربلند باشید در پناه حق:n16:.

iranch
28-08-2013, 14:23
int i = 0 فرقی با int i = new int() نداره.
معذرت میخواهم اما این i = 0 یعنی set کردن 0 درون متغیر i پس باید حافظه براش گرفته بشه همین طور int i = new int ()
ممکنه من این رو نفهمیده باشم



دقت کنید منظور از مقدار دهی این نیست که اشاره گر آرایه در حافظه نرفته باشه.نه

Msba
28-08-2013, 18:13
من از پست اول شروع می کنم.
سوال جالبی است! (:n29:)
نوع int آنقدر کوچک است که نمی توان آن را با TaskManager بررسی کرد برای همین شاید آرایه، آن جوابی را که بخواهیم ندهد. اما منطق پست دوم تاپیک را دوست دارم اما صحیح بودنش را برای یک نوع ساده مثل int را مرددم.:n01:
دو نوع حافظه در هنگام اجرای برنامه ایجاد می شود:
Initial
Uninitial
------------
مثلا می نویسیم: int i - (متغیر عمومی، یا عمومی با تعریف static)
خوب اگر این متغیر استفاده نشود کامپایلر آن را بهینه کرده در نتیجه از برنامه حذف می گردد وهیچ حافظه ای هم اشغال نمی کند حالا می خواهد مقدار اولیه هم داشته باشد!
اگر استفاده شود و مقدار اولیه نداشته باشد در حافظه ی Unintial قرار گرفته.در نتیجه اجرای برنامه چه با new و چه بدون new برای int باشد کامپایلر خود حافظه را اختصاص می دهد. (بحث راجب آرایه نیست)
فقط یک تفاوت در داشتن مقدار اولیه وجود دارد. این که متغیر در حافظه intial قرار می گیرد یا Uninitial . در حافظه ی Uninitial . پس initial چیست؟ یک قسمت از کدهای اجرایی درون Initial موظفند تا مقادیر Uninitial را بارگذاری کنند. پس به دو طریق مقدار اولیه قرار خواهد گرفت: توسط کد، توسط سیستم مرجع (مثلا سیستم عامل). اگر برنامه هنگام باز شدن خود مقادیرش را تنظیم کند یعنی هنگام Runtime می شود توسط کد، کدی که کامپایلر تولید کرده است.
روش دوم فکر کنم در PC کاربردی ندارد.
اما اگر تعریف متغیر محلی و استفاده شود : زمانی که برنامه به متد یا تابع مورد نظر می پرد. متغیر های مورد استفاده درون استک قرار می گیرند، چگونه؟ با استک پویتنر به همراه یک اشاره گر عددی!
حالا نوع struct کلا در stack قرار دارد. یعنی خبری از Heap نیست. پس تا کامپایلر به تعریف متغیر از این نوع می رسد. بلافاصله فضا اختصاص داده می شود. و هیچ احتیاجی به new نیست حتی struct که خودتان تعریف کرده اید نیز همین هست. اما یک نکته: مدیریت حافظه دست مانیست! الان اشاره گر عددی stack آماده است.اما ویندوز و .net ( یار گرمابه و گلستان هم :n02:) هم عین مرد نمی گذارند فضا هدر رود.اون حافظه را حذف و اون یکی مرتب می کند(مشکل Ram Fragmentation)
آرایه ها نوع عددی نیستند یعنی new می خواهند تا در فضای Heap بنشینند، پس بدون new یک اشاره گر بیشتر نیستند. اما نوع های عددی این طوری نیستند. struct ها عددیند و دریافت حافظه مستقیم دارند. new در آن ها به معنای اخذ حافظه نیست بلکه یکسری آماده سازی توسط کاربر و شایدم امکان new کردن نوع های رفرنسی درون struct توسط برنامه نویس باشد.
پس در struct هایی که Constructor ندارند new و بدون new تفاوتی ندارند.

موفق باشید.

rezaa2000
28-08-2013, 18:23
ممنون درست شد