PDA

View Full Version : تفاوت در allocate کردن حافظه .



mohsen10132
شنبه 23 اردیبهشت 1391, 16:15 عصر
سلام دوستان .
من امروز داشتم به راهنمای msdn نگاه میکردم که چطور میتونم حافظه ای از رم رو در اختیار برنامه ام قرار بدم که به موضوع جالبی برخورد کردم و اونم اختصاص دادن حافظه با بیش از 4 روش زیر بود:

1 - تابع GlobalAlloc
2 - تابع HeapAlloc
3 - تابع LocalAlloc
4 - تابع VirtualAlloc


حالا درخواستی که از اساتید برنامه نویسی دارم اینه که بگن چه تفاوت هایی بین allocate کردن حافظه با چهار تابع فوق هست ؟ و هر کدومشون چه مزیتی نسبت به دیگری داره .

mehdi.mousavi
شنبه 23 اردیبهشت 1391, 16:30 عصر
سلام.
لطفا به این مقاله (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366533%28v=vs.85%29.aspx) مراجعه کنید.

موفق باشید.

mohsen10132
شنبه 23 اردیبهشت 1391, 23:21 عصر
مرسی آقا مهدی ، دو ساعته دارم با این انگلیسی خرابم ترجمه میکنم چیزی دستگیرم نمیشه به صورت تخصصی ,:عصبانی++: میشه خودت بگی اونجا چی نوشته ؟

لطفا کمک کنید ، همه که انگلیسیشون خوب نیست . باور کنید چیزی متوجه نشدم. فقط میخوام یکی به زبون ساده بیاد بگه تفاوتشون بر طبق اسناد علمی مثل بالا چیه همین .

mehdi.mousavi
چهارشنبه 27 اردیبهشت 1391, 15:06 عصر
مرسی آقا مهدی ، دو ساعته دارم با این انگلیسی خرابم ترجمه میکنم چیزی دستگیرم نمیشه به صورت تخصصی ,:عصبانی++: میشه خودت بگی اونجا چی نوشته ؟ لطفا کمک کنید ، همه که انگلیسیشون خوب نیست . باور کنید چیزی متوجه نشدم. فقط میخوام یکی به زبون ساده بیاد بگه تفاوتشون بر طبق اسناد علمی مثل بالا چیه همین .

سلام.
GlobalAlloc، LocalAlloc و HeapAlloc، همگی در نهایت حافظه مورد نظر رو از Heap تخصیص میدن، اما با هم دیگه تفاوت های کوچکی دارن. بطور نمونه میشه از HeapAlloc خواست تا اگر حافظه مورد نظر برای تخصیص کم بود، Exception ای Throw کنه، قابلیتی که LocalAlloc از اون بی بهره هستش. LocalAlloc اجازه میده تا بتونه برای Handle ها حافظه اختصاص بدید، حافظه ای که بدون تغییر مقدار handle قابل انتقال هستش، امکانی که HeapAlloc از اون بی بهره هستش. در Windows های 32 بیتی (به بعد)، GlobalAlloc و LocalAlloc با استفاده از Handle ای به heap پروسه، فقط HeapAlloc رو Call میکنن، در نتیجه نسبت به HeapAlloc سربار بیشتری دارن. هر کدوم از این توابع از مکانیزم های متفاوتی برای اختصاص حافظه استفاده می کنن، پس باید حافظه دریافتی توسط متود معادلشون به سیستم برگردونده بشه. تابع malloc نیز وابسته به runtime هستش. اپراتور new نیز به Compiler و زبان وابسته هستش. CoTaskMemAlloc و CoTaskMemFree رو هم میشه از C، C++ و VB (و ...) Call کرد و تنها راه برای به اشتراک گذاشتن حافظه در برنامه های COM هستش.

موفق باشید.

پاورقی: من بخش هایی از متن مورد نظر رو براتون به فارسی نوشتم که کارتون راه بیفته، اما بپذیرید که اینطوری نمیشه در این رشته پیشرفت کرد.