سؤال

كيف تخصيص الذاكرة التي تتماشى إلى حدود محددة في ج (مثل حدود خط ذاكرة التخزين المؤقت)؟ أبحث عن 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().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top