كيفية تخصيص ذاكرة محاذاة مجانية في ج
-
20-09-2019 - |
سؤال
كيف تخصيص الذاكرة التي تتماشى إلى حدود محددة في ج (مثل حدود خط ذاكرة التخزين المؤقت)؟ أبحث عن malloc / free مثل التنفيذ الذي سيكون مثاليا هو محمول ممكن --- على الأقل بين 32 و 64 بت بنية.
تحرير لإضافة: بمعنى آخر، أبحث عن شيء يتصرف مثل (العاصفة الآن؟) memlign. وظيفة، والتي يمكن تحريرها باستخدام مجانا.
المحلول
فيما يلي حل، الذي يغلف المكالمة إلى Malloc، يخصص مخزن مؤقت أكبر لغرض المحاذاة، ويخزن العنوان الأصلي المخصص فقط قبل المخزن المؤقت المحاذاة للحصول على مكالمة لاحقة مجانا.
// cache line
#define ALIGN 64
void *aligned_malloc(int size) {
void *mem = malloc(size+ALIGN+sizeof(void*));
void **ptr = (void**)((uintptr_t)(mem+ALIGN+sizeof(void*)) & ~(ALIGN-1));
ptr[-1] = mem;
return ptr;
}
void aligned_free(void *ptr) {
free(((void**)ptr)[-1]);
}
نصائح أخرى
يستخدم posix_memalign
/free
.
int posix_memalign(void **memptr, size_t alignment, size_t size);
void* ptr;
int rc = posix_memalign(&ptr, alignment, size);
...
free(ptr)
posix_memalign
هو استبدال قياسي ل memalign
التي، كما ذكرت عفا عليها الزمن.
ما المترجم الذي تستخدمه؟ إذا كنت على MSVC، فيمكنك تجربة _aligned_malloc()
و _aligned_free()
.
لا تنتمي إلى StackOverflow