mimalloc في C++: دليل شامل مع أمثلة تطبيقية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

mimalloc في C++: مُخصّص ذاكرة عالي الأداء

في تطوير تطبيقات C++ الحديثة، تُعتبر إدارة الذاكرة من أهم العوامل المؤثرة على أداء التطبيق. غالبًا ما يعجز المُخصّص الافتراضي (مثل malloc من glibc أو jemalloc) عن التعامل مع الأحمال العالية في البيئات متعددة الخيوط أو عند التخصيص/التحرير المتكرر للكتل الصغيرة. mimalloc (اختصارًا لـ "microsoft mimalloc") هو مُخصّص ذاكرة عام صغير الحجم لكنه سريع للغاية، طوّرته Microsoft Research. يُظهر نتائج مذهلة: أسرع بمقدار 2-3 مرات من malloc في السيناريوهات متعددة الخيوط مع استهلاك أقل للذاكرة بشكل ملحوظ.

لماذا نستخدم mimalloc؟ أولاً، تم تحسينه للمعالجات الحديثة متعددة النوى: فهو يستخدم ذاكرة تخزين مؤقت محلية لكل خيط (thread-local caches) ويقلل من التنافس على الأقفال العامة. ثانيًا، يحارب تجزئة الذاكرة بكفاءة بفضل خوارزمية "تقسيم قوائم التحرير" (free list sharding) التي توزع قوائم الكتل الحرة حسب الحجم والخيط. ثالثًا، يتمتع mimalloc بحماية مدمجة ضد بعض أنواع الثغرات (مثل التحرير المزدوج والاستخدام بعد التحرير) ويدعم "التخصيصات المحروسة" (guarded allocations) لأغراض التصحيح. هذا يجعله الخيار الأمثل للخوادم عالية التحميل، ومحركات الألعاب، وقواعد البيانات، وأي كود C++ تكون فيه سرعة التعامل مع الذاكرة أمرًا بالغ الأهمية.

في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت mimalloc، وكيفية استخدام دواله الأساسية، وسنقدم أمثلة عملية لدمجه في مشاريع C++. ستتعلم كيف تستبدل malloc الافتراضي بسطر واحد فقط من الكود لتحصل على زيادة في الأداء تصل إلى 30-50% دون تغيير منطق الأعمال.

التثبيت

يمكن تثبيت mimalloc بعدة طرق. الطريقة الموصى بها هي عبر مدير الحزم vcpkg أو Conan، أو عن طريق البناء من المصدر.

عبر vcpkg (موصى به لأنظمة Windows/Linux/macOS)

# قم بتثبيت vcpkg إذا لم يكن مثبتًا
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh  # أو .\bootstrap-vcpkg.bat على ويندوز
./vcpkg integrate install

# تثبيت mimalloc
./vcpkg install mimalloc

عبر Conan

conan install mimalloc/2.1.6@

البناء من المصدر (Linux/macOS)

git clone https://github.com/microsoft/mimalloc
cd mimalloc
mkdir -p build && cd build
cmake ..
make -j$(nproc)
sudo make install

ربطه بمشروع CMake

find_package(mimalloc REQUIRED)
target_link_libraries(my_target PRIVATE mimalloc::mimalloc)

بداية سريعة: مثال عملي بسيط

أسهل طريقة لبدء استخدام mimalloc هي استبدال malloc/new الافتراضية بنسختها. يكفي إعادة تعريف العوامل العامة new/delete.

#include <iostream>
#include <mimalloc.h>
#include <mimalloc-new-delete.h>  // يعيد تعريف new/delete العامة

int main() {
    // الآن جميع عمليات new/delete تستخدم mimalloc
    int* arr = new int[1000];
    for (int i = 0; i < 1000; ++i) arr[i] = i;
    std::cout << "المجموع: " << arr[500] << std::endl;
    delete[] arr;

    // يمكنك أيضًا استخدام دوال C مباشرة
    void* p = mi_malloc(64);
    mi_free(p);

    return 0;
}

قم بتجميعه مع ربط mimalloc:

g++ -std=c++17 main.cpp -lmimalloc -o test

الدوال والطرق الأساسية

يوفر mimalloc واجهة برمجة متوافقة مع لغة C (دوال ببادئة mi_) بالإضافة إلى أغلفة C++. دعنا نستعرض 8 دوال رئيسية.

1. mi_malloc — تخصيص الذاكرة

التوقيع: void* mi_malloc(size_t size)

الوظيفة: تخصيص كتلة ذاكرة بحجم size بايت. مشابه لـ malloc التقليدي لكنه محسّن للعمل متعدد الخيوط.

#

توصيات