۱۴۰۴/۰۷/۰۹
تفاوت stack , heap در سی شارپ
۱. Stack (پشته)
- کاربرد:
ذخیره متغیرهای value type و آدرسهای مرجع برای reference type (نه خود شیء). - ویژگیها:
- سریع و مدیریت ساده: وقتی بلوک کد تمام میشود، حافظه خودکار آزاد میشود.
- اندازه محدود: معمولاً چند مگابایت، بنابراین برای دادههای خیلی بزرگ مناسب نیست.
- LIFO (Last In, First Out): آخرین چیزی که ذخیره شد، اولین چیزی است که برداشته میشود.
- Scope محلی: وقتی متغیر از scope خارج میشود، حافظه آزاد میشود.
- مثال:
void Example()
{
int x = 10; // روی stack ذخیره میشود
int y = 20; // روی stack ذخیره میشود
} // x و y وقتی بلوک تمام شد، آزاد میشوند
هر متغیری که Value Type باشد و خارج از کلاس نباشد، روی Stack ذخیره میشود.
۲. Heap (انبار حافظه)
- کاربرد:
ذخیره شیءهای Reference Type مثلclass,string,array. - ویژگیها:
- مدیریت توسط Garbage Collector (GC): حافظه خودکار پاک میشود وقتی هیچ مرجعی به شیء وجود نداشته باشد.
- بزرگ و انعطافپذیر: میتوان اشیاء بزرگ یا طول عمر طولانی ایجاد کرد.
- کندتر از stack: چون GC باید بررسی کند چه چیزهایی دیگر استفاده نمیشوند.
- نیاز به مرجع (Reference): برای دسترسی به دادهها، معمولاً یک آدرس در Stack نگه داشته میشود.
- مثال:
class Person
{
public string Name;
}
void Example()
{
Person p = new Person(); // شیء Person روی heap ساخته میشود
p.Name = "Ali"; // نام روی heap ذخیره میشود
} // وقتی p از scope خارج شود، GC ممکن است این شیء را جمعآوری کند
توجه: متغیر
pخود یک reference است که روی stack ذخیره میشود، اما داده واقعی (Person) روی heap است.
۳. مقایسه سریع Stack و Heap
| ویژگی | Stack | Heap |
|---|---|---|
| نوع داده | Value Type / مرجع Reference | Reference Type (شیء) |
| سرعت دسترسی | سریع | کندتر |
| مدیریت حافظه | خودکار و ساده | توسط GC |
| اندازه | کوچک | بزرگ |
| طول عمر | کوتاه، وابسته به scope | طولانی، وابسته به مرجع |
| نحوه آزادسازی | هنگام خروج از scope | وقتی GC تشخیص دهد |
نکات مهم برای آزمون:
- Value Type → Stack، Reference Type → Heap
- وقتی Reference Type را assign میکنی، فقط مرجع کپی میشود، خود شیء در heap یکسان است
- Stack سریع و محدود است، Heap کندتر و بزرگتر است
- Boxing → value type از stack به heap میرود
Accept Cookies
[your-shortcode]