کتابخانه‌ی استاندارد · سیستم و ابزار

حافظه mem

کار مستقیم با حافظه: تخصیص و آزادسازی، رونوشت، قلمرو و استخر، و بررسی نشتی.

واردسازی حافظه
در این صفحه
  1. گونه‌ها
  2. روال‌ها

بیشتر برنامه‌ها هیچ‌وقت به این بسته نیاز ندارند: وکتور و نگاشت و رشته حافظه‌شان را خودشان مدیریت می‌کنند. بسته‌ی حافظه برای کارهای سطح پایین است، مثل همکاری با کتابخانه‌های C یا ساختن ساختمان داده‌ی خودتان. هر چه با تخصیص می‌گیرید، باید با آزادسازی پس بدهید.

قلمرو (arena) یک تکه حافظه‌ی بزرگ است که از آن پشت‌سرهم برمی‌دارید و در پایان همه را یک‌جا رها می‌کنید؛ برای کارهایی با تعداد زیادی شیء کوچک هم‌عمر خیلی سریع است. استخر بلوک‌های هم‌اندازه می‌دهد و پس می‌گیرد.

گونه‌ها

قلمرو Arena

ساختار قلمرو
یک قلمرو حافظه.
نامانگلیسیگونهتوضیح
bufbufتهی*نشانی حافظه‌ی قلمرو.
capcapطبیعی۶۴ظرفیت بر حسب بایت.
usedusedطبیعی۶۴مقدار استفاده‌شده.
mem-Arena.salam
واردسازی حافظه

روال ریشه:
    ناپایا ق := حافظه.قلمرو جدید(۱۰۲۴ برگردان طبیعی۶۴)
    سرچاپ حافظه.ظرفیت قلمرو(ق)، حافظه.استفاده شده قلمرو(ق)
    الف := حافظه.تخصیص در قلمرو(ق، ۱۰۰ برگردان طبیعی۶۴)
    ب := حافظه.تخصیص صفرشده در قلمرو(ق، ۲۰۰ برگردان طبیعی۶۴)
    سرچاپ الف != پوچ، ب != پوچ، حافظه.استفاده شده قلمرو(ق) >= ۳۰۰، حافظه.باقیمانده قلمرو(ق) <= ۷۲۴
    سرچاپ حافظه.تخصیص در قلمرو(ق، ۴۰۰۰ برگردان طبیعی۶۴) == پوچ
    حافظه.بازنشانی قلمرو(ق)
    سرچاپ حافظه.استفاده شده قلمرو(ق)، ق.cap
    حافظه.آزادسازی قلمرو(ق)
پایان
خروجی1024 0 true true true true true 0 1024

استخر Pool

ساختار استخر
یک استخر بلوک‌های هم‌اندازه.
نامانگلیسیگونهتوضیح
block_sizeblock_sizeطبیعی۶۴اندازه‌ی هر بلوک.
block_countblock_countطبیعی۶۴تعداد بلوک‌ها.
blocksblocksتهی*نشانی حافظه‌ی بلوک‌ها.
free_listfree_listتهی*فهرست بلوک‌های آزاد.
mem-Pool.salam
واردسازی حافظه

روال ریشه:
    ناپایا ا := حافظه.استخر جدید(۳۲ برگردان طبیعی۶۴، ۴ برگردان طبیعی۶۴)
    سرچاپ حافظه.اندازه بلوک(ا)، حافظه.ظرفیت استخر(ا)
    ب۱ := حافظه.تخصیص از استخر(ا)
    ب۲ := حافظه.تخصیص از استخر(ا)
    سرچاپ ب۱ != پوچ، ب۲ != پوچ، ب۱ != ب۲
    حافظه.بازگشت به استخر(ا، ب۱)
    ب۳ := حافظه.تخصیص از استخر(ا)
    سرچاپ ب۳ == ب۱
    حافظه.نابودسازی استخر(ا)
پایان
خروجی32 4 true true true true

روال‌ها

قلمرو جدید NewArena

روال قلمرو جدید(capacity: طبیعی۶۴): قلمرو
قلمرویی با ظرفیت داده‌شده می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

تخصیص در قلمرو ArenaAlloc

روال تخصیص در قلمرو(a &: قلمرو، size: طبیعی۶۴): تهی*
از قلمرو حافظه برمی‌دارد؛ اندازه به مضرب ۸ گرد می‌شود. اگر جا نباشد یا اندازه صفر باشد، پوچ برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

تخصیص صفرشده در قلمرو ArenaAllocZeroed

روال تخصیص صفرشده در قلمرو(a &: قلمرو، size: طبیعی۶۴): تهی*
مثل تخصیص در قلمرو، با حافظه‌ی صفرشده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

بازنشانی قلمرو ArenaReset

روال بازنشانی قلمرو(a &: قلمرو)
همه‌ی برداشت‌ها را یک‌جا پس می‌گیرد تا قلمرو دوباره استفاده شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

آزادسازی قلمرو ArenaFree

روال آزادسازی قلمرو(a &: قلمرو)
حافظه‌ی قلمرو را رها می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

استفاده شده قلمرو ArenaUsed

روال استفاده شده قلمرو(a &: قلمرو): طبیعی۶۴
بایت‌های استفاده‌شده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

ظرفیت قلمرو ArenaCapacity

روال ظرفیت قلمرو(a &: قلمرو): طبیعی۶۴
ظرفیت قلمرو.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

باقیمانده قلمرو ArenaRemaining

روال باقیمانده قلمرو(a &: قلمرو): طبیعی۶۴
بایت‌های باقیمانده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Arena.salam

استخر جدید NewPool

روال استخر جدید(block_size: طبیعی۶۴، block_count: طبیعی۶۴): استخر
استخری با تعداد و اندازه‌ی بلوک داده‌شده می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Pool.salam

تخصیص از استخر PoolAlloc

روال تخصیص از استخر(p &: استخر): تهی*
یک بلوک آزاد می‌دهد؛ اگر نماند، پوچ.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Pool.salam

بازگشت به استخر PoolFree

روال بازگشت به استخر(p &: استخر، ptr: تهی*)
بلوک را به استخر برمی‌گرداند؛ بلوک بعدی همین را می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Pool.salam

اندازه بلوک PoolBlockSize

روال اندازه بلوک(p &: استخر): طبیعی۶۴
اندازه‌ی بلوک.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Pool.salam

ظرفیت استخر PoolCapacity

روال ظرفیت استخر(p &: استخر): طبیعی۶۴
تعداد کل بلوک‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Pool.salam

نابودسازی استخر PoolDestroy

روال نابودسازی استخر(p &: استخر)
حافظه‌ی استخر را رها می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Pool.salam

تخصیص Allocate

روال تخصیص(size: طبیعی۶۴): تهی*
تکه‌ای حافظه با اندازه‌ی داده‌شده می‌گیرد؛ محتوایش مشخص نیست.
mem-Allocate.salam
واردسازی حافظه

روال ریشه:
    ب := حافظه.تخصیص(۸ برگردان طبیعی۶۴)
    حافظه.تنظیم(ب، ۰، ۸ برگردان طبیعی۶۴)
    ا := ب برگردان صحیح۸*
    ا[۰] = ۶۵ برگردان صحیح۸
    ا[۱] = ۶۶ برگردان صحیح۸
    ب۲ := حافظه.تخصیص صفرشده(۸ برگردان طبیعی۶۴)
    حافظه.کپی(ب۲، ب، ۲ برگردان طبیعی۶۴)
    ا۲ := ب۲ برگردان صحیح۸*
    سرچاپ ا۲[۰]، ا۲[۱]، ا۲[۲]
    حافظه.جابجایی حافظه(ب، (ب برگردان صحیح۶۴ + ۱) برگردان تهی*، ۱ برگردان طبیعی۶۴)
    سرچاپ ا[۰]
    ب۳ := حافظه.بازتخصیص(ب، ۶۴ برگردان طبیعی۶۴)
    آ := حافظه.تخصیص آرایه(۴ برگردان طبیعی۶۴، ۸ برگردان طبیعی۶۴)
    آ۶۴ := آ برگردان صحیح۶۴*
    سرچاپ آ۶۴[۳]
    حافظه.آزادسازی(ب۳)
    حافظه.آزادسازی(ب۲)
    حافظه.آزادسازی(آ)
پایان
خروجی65 66 0 66 0

بازتخصیص Reallocate

روال بازتخصیص(ptr: تهی*، size: طبیعی۶۴): تهی*
اندازه‌ی حافظه‌ی گرفته‌شده را تغییر می‌دهد و محتوا را نگه می‌دارد؛ ممکن است نشانی تازه‌ای برگرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

آزادسازی Free

روال آزادسازی(ptr: تهی*)
حافظه را پس می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

تنظیم Set

روال تنظیم(ptr: تهی*، value: صحیح، n: طبیعی۶۴)
n بایت را با مقدار داده‌شده پر می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

کپی Copy

روال کپی(dst: تهی*، src: تهی*، n: طبیعی۶۴)
n بایت را رونوشت می‌کند؛ دو بازه نباید هم‌پوشانی داشته باشند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

جابجایی حافظه MemMove

روال جابجایی حافظه(dst: تهی*، src: تهی*، n: طبیعی۶۴): تهی*
مثل کپی، ولی حتی اگر بازه‌ها هم‌پوشانی داشته باشند درست کار می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

تخصیص صفرشده AllocateZeroed

روال تخصیص صفرشده(size: طبیعی۶۴): تهی*
حافظه‌ی صفرشده می‌گیرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

تخصیص آرایه AllocateArray

روال تخصیص آرایه(count: طبیعی۶۴، size: طبیعی۶۴): تهی*
حافظه‌ی صفرشده برای count عضو هر کدام size بایت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Allocate.salam

شمار تخصیص AllocCount

روال شمار تخصیص(): صحیح۶۴
تعداد تخصیص‌ها؛ فقط در ساخت با اشکال‌زدایی حافظه، وگرنه صفر.
mem-Debug.salam
واردسازی حافظه

روال ریشه:
    سرچاپ حافظه.اشکال زدایی حافظه فعال است()، حافظه.ای سن فعال است()، حافظه.بررسی حافظه فعال است()
    سرچاپ حافظه.شمار تخصیص()، حافظه.شمار آزادسازی()، حافظه.بایت های زنده()، حافظه.بیشترین بایت ها()
    حافظه.بررسی نشتی()
پایان
خروجیfalse false false 0 0 0 0

شمار آزادسازی FreeCount

روال شمار آزادسازی(): صحیح۶۴
تعداد آزادسازی‌ها؛ فقط در ساخت با اشکال‌زدایی حافظه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam

بایت های زنده LiveBytes

روال بایت های زنده(): صحیح۶۴
بایت‌هایی که گرفته و هنوز پس داده نشده‌اند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam

بیشترین بایت ها PeakBytes

روال بیشترین بایت ها(): صحیح۶۴
بیشترین حافظه‌ی گرفته‌شده در یک لحظه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam

اشکال زدایی حافظه فعال است IsMemDebug

روال اشکال زدایی حافظه فعال است(): منطقی
اگر برنامه با شمارش تخصیص ساخته شده باشد، درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam

ای سن فعال است IsAsanActive

روال ای سن فعال است(): منطقی
اگر برنامه با بررسی‌گر ASAN ساخته شده باشد، درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam

بررسی حافظه فعال است MemDebugActive

روال بررسی حافظه فعال است(): منطقی
اگر یکی از دو بررسی‌گر حافظه فعال باشد، درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam

بررسی نشتی CheckLeaks

روال بررسی نشتی()
اگر حافظه‌ای پس داده نشده باشد، گزارش می‌دهد؛ در پایان برنامه صدا بزنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: mem-Debug.salam