۱۴۰۴/۰۷/۰۹
Memory Management و Performance در C#
✅ Stack vs Heap و تاثیر آن بر Performance
| ویژگی | Stack | Heap |
|---|---|---|
| محل ذخیره | متغیرهای Value Type و Reference Pointerها | خود شیءهای Reference Type |
| سرعت | بسیار سریع (LIFO, مدیریت خودکار) | نسبتاً کند (مدیریت توسط GC) |
| مدیریت حافظه | خودکار هنگام خروج از Scope | Garbage Collector باید تشخیص دهد که دیگر شیء استفاده نمیشود |
| مثالها | int, bool, struct, double | class, string, array, List<T> |
✅ Value Type vs Reference Type
| نوع | محل ذخیره | عملکرد |
|---|---|---|
| Value Type (مثل int, float, struct) | کاملاً در Stack ذخیره میشوند | سریع و سبک |
| Reference Type (مثل class, string) | در Stack فقط Reference نگهداری میشود، ولی شیء در Heap ساخته میشود | کندتر چون تخصیص و آزادسازی پیچیدهتر است |
✅ Garbage Collector (GC)
- در C#، Heap به صورت دستی آزاد نمیشود.
- GC به صورت خودکار وقتی تشخیص دهد شیء دیگر استفاده نمیشود، آن را آزاد میکند.
- این کار هزینه دارد و ممکن است باعث توقف لحظهای (Pause) در برنامه شود.
⚠️ Boxing و Unboxing — دشمن Performance
🔹 Boxing چیست؟
وقتی یک Value Type به Reference Type تبدیل میشود:
int x = 10;
object obj = x; // Boxing → int داخل heap قرار میگیرد
🔹 Unboxing چیست؟
وقتی Reference دوباره به Value Type تبدیل شود:
int y = (int)obj; // Unboxing → بازیابی مقدار از heap
❌ مشکلش چیه؟
- هزینهی زمانی و حافظه دارد چون:
- مقدار از Stack به Heap منتقل میشود.
- GC بعداً باید آن را مدیریت کند.
✅ راه مقابله با Boxing → استفاده از Generics
ArrayList list = new ArrayList();
list.Add(10); // boxing رخ میدهد
List<int> list2 = new List<int>();
list2.Add(10); // بدون boxing → سریعتر
✅ جمعبندی مهم برای آزمون
| نکته | توضیح |
|---|---|
| Stack سریعتر از Heap است | چون ساختارش سادهتر است (LIFO) |
| Value Type → Stack | سبک و سریع |
| Reference Type → Heap | کندتر و نیازمند GC |
| GC هزینه دارد | بهتر است تعداد اشیاء بیمصرف را کم کنیم |
| Boxing هزینه دارد | با Generics جلوگیری کنیم |
Accept Cookies
[your-shortcode]