PDA

View Full Version : فضاي اشغالي يك كلاس



JalaliMehr
جمعه 01 مرداد 1389, 14:13 عصر
مي دونم كه كلاس تو دلفي از نوع اشاره گر هستند و وقتي Sizeof مي گيريم 4 بر مي گردونه حالا ميخام بدونم راهي داره حجم اشغالي واقعي كلاس رو بدست بياريم.

vcldeveloper
شنبه 02 مرداد 1389, 06:41 صبح
می تونید متد InstanceSize اون کلاس رو فراخوانی کنید:


ShowMessage(IntToStr(TObject.InstanceSize));

bootshow
شنبه 02 مرداد 1389, 16:37 عصر
میتونید جلوی متغیر اشاره گر ^ بزارید مثلا
var
pj:PINT;
begin
ShowMessage(IntToStr(SizeOf(pj^) ) );

vcldeveloper
شنبه 02 مرداد 1389, 18:12 عصر
میتونید جلوی متغیر اشاره گر ^ بزارید مثلا
اون کار به اون شکل به درد کلاس ها نمیخوره. در مثال شما، علت اینکه اندازه فضای اشغالی درست نمایش داده میشه، این هست که اشاره گر شما یک Typed Pointer هست (PInt)، یعنی کامپایلر از قبل میدونه که نوع داده ذخیره شده در آن فضا Integer هست، و اندازه Integer هم مشخص هست.

در حالی که متد InstanceSize مقدار حافظه مورد نیاز رو از یک فیلد مخفی با نام vmtInstanceSize میخونه.

مصطفی ساتکی
شنبه 02 مرداد 1389, 18:35 عصر
حالا چرا اندازه كلاس از 8 شروع ميشه .تا حالا دقت نكرده بودم.اين تاپيكو ديدم يه خورده با instanceSize ور رفتم ديدم اگر يه كلاسي توش Extended تعريف كني كه 8 بايته Instance سايز 28 رو بر مي گيردونه.
قضيه alignment حافظه هم باشه نمي دونم اين عدد 28 چطوري بدست اومد.

vcldeveloper
شنبه 02 مرداد 1389, 20:09 عصر
حالا چرا اندازه كلاس از 8 شروع ميشه .
به این دلیل که همه کلاس ها از TObject مشتق میشند، و TObject در دلفی 2010 اندازه اش 8 بایت هست.

مصطفی ساتکی
یک شنبه 03 مرداد 1389, 14:00 عصر
به این دلیل که همه کلاس ها از TObject مشتق میشند، و TObject در دلفی 2010 اندازه اش 8 بایت هست.
اينكه مشخصه.
اين قسمت مشكوك ميزنه
اگر يه كلاسي توش Extended تعريف كني كه 8 بايته Instance سايز 28 رو بر مي گيردونه.
قضيه alignment حافظه هم باشه نمي دونم اين عدد 28 چطوري بدست اومد.

vcldeveloper
یک شنبه 03 مرداد 1389, 22:51 عصر
اگر يه كلاسي توش Extended تعريف كني كه 8 بايته Instance سايز 28 رو بر مي گيردونه.
میدونم، دیدم؛ ظاهرا فقط برای نوع داده های خاصی مثل Extended همچین اتفاقی میافته، مثلا اگر Integer اضافه بشه، همون مقدار 4 بایت به InstanceSize اضافه میشه. من زیاد دنبالش نرفتم، ولی بعضی جاها گفته شده که دلفی داده ها را به صورت 8 بایت Align میکنه، بعضی جاها هم 4 بایت گفته شده. دقیقا نمیدونم مسئله چی هست، ولی می تونید توی StackOverflow بپرسید، اونجا معمولا Allen Bauer و Barry Kelly (مدیر تیم کامپایلر دلفی) به اینجور سوالات که به کارکرد داخلی کامپایلر مربوط میشند، جواب میدند.