Heap و Stack Allocation در C# 🧠💾(بخش اول)
درک نحوهی تخصیص (allocation) و مدیریت حافظه در #C برای بهینهسازی عملکرد (performance) برنامه و اطمینان از استفادهی کارآمد از منابع بسیار حیاتی است.
در این راهنمای جامع، مفاهیم heap و stack allocation در #C را بررسی میکنیم؛ اینکه چگونه کار میکنند، چه زمانی استفاده میشوند، و چگونه بر عملکرد کد شما تأثیر میگذارند.
مقدمهای بر Memory Allocation
مدیریت حافظه در #C اغلب توسط runtime مربوط به NET. انجام میشود؛ به این معنا که توسعهدهندگان در بیشتر مواقع نیازی به تخصیص و آزادسازی دستی حافظه ندارند.
با این حال، درک اینکه دادههای شما چگونه و در کجا تخصیص داده میشوند — در stack یا در heap — میتواند به شما کمک کند کدی کارآمدتر و با performance بهتر بنویسید. ⚙️
در سیشارپ ، stack و heap دو ناحیهی حافظه هستند که برای ذخیرهسازی دادهها استفاده میشوند:
• ءstack برای static memory allocation استفاده میشود
• ءheap برای dynamic memory allocation استفاده میشود
ءStack Allocation چیست؟
ءstack ناحیهای از حافظه است که value typeها و pointerهای reference type را ذخیره میکند.
این ساختار از مدل Last-In, First-Out (LIFO) پیروی میکند؛ به این معنی که آخرین دادهی تخصیص دادهشده، اولین دادهای است که آزاد میشود.
به دلیل این ساختار، stack allocation بسیار سریع و کارآمد است. 🚀
ویژگیهای Stack Allocation:
🔹️Automatic Memory Management:
دادهها بهصورت خودکار هنگام خروج از scope آزاد میشوند
🔹️LIFO Structure:
استفاده از مدل LIFO باعث استفادهی بهینه از حافظه میشود
🔹️Limited Size:
اندازهی stack محدود است و برای objectهای بزرگ مناسب نیست
ءHeap Allocation چیست؟
ءheap برای dynamic memory allocation استفاده میشود.
اینجاست که reference typeها (مانند objectها، stringها و ...) تخصیص داده میشوند.
ءheap توسط Garbage Collector (GC) مدیریت میشود که بهصورت دورهای حافظهای که دیگر استفاده نمیشود را آزاد میکند. ♻️
ویژگیهای Heap Allocation:
🔹️Managed by Garbage Collector:
ء GC فرآیند آزادسازی حافظه را بهصورت خودکار مدیریت میکند
🔹️Dynamic Allocation:
ءobjectها میتوانند حتی پس از اتمام متدی که آنها را ایجاد کرده، باقی بمانند
🔹️Larger Memory Pool:
ءheap میتواند نسبت به stack objectهای بسیار بزرگتری را ذخیره کند
تفاوت بین Stack و Heap
تفاوتهای کلیدی بین stack و heap allocation در #C حول محور نحوه و زمان تخصیص و آزادسازی حافظه میچرخند.
حافظهی stack کارآمد است و برای دادههای کوتاهعمر (short-lived) که scope آنها محدود به function یا method است مناسب میباشد.
در مقابل، heap برای دادههایی استفاده میشود که نیاز دارند فراتر از scope یک method باقی بمانند؛ مانند instanceهای reference type.
ءstack مدیریت حافظهی خودکار و بسیار سریعی را فراهم میکند، اما از نظر اندازه محدود است و نمیتواند ساختارهای دادهای بزرگ و پیچیده را مدیریت کند.
ءheap در حالی که انعطافپذیری بیشتر و تخصیص حافظهی بزرگتری ارائه میدهد، نیازمند garbage collection است که مقداری overhead در performance ایجاد میکند. 📉
نحوهی عملکرد Stack در #C: مثال
برای درک بهتر stack allocation، به مثال زیر توجه کنید:
public void StackExample()
{
int a = 5;
int b = 10;
int result = a + b;
}
در مثال بالا:
اعداد صحیح a، b و result روی stack تخصیص داده میشوند زیرا از نوع value type هستند
زمانی که متد StackExample به پایان میرسد، تمام حافظهی استفادهشده توسط این متغیرها بهصورت خودکار آزاد میشود