سؤال

وأعمل على تنفيذ تجمع الذاكرة وأنا بشيء من الارتباك حول مواءمة المؤشرات ...

لنفترض أن لدي تجمع الذاكرة التي يسلم بها كتل الذاكرة حجم ثابت، عند نقطة تجمع الذاكرة خلق I malloc ((حجم) * (الأسطوانات من بنات)). إذا ما تم تخصيص كائنات وحجم يأتي من محاذاة المشغل sizeof لا ينبغي أن يكون مصدر قلق، ولكن إذا كان حجم غير متساو (هو / هي تريد 100 كتل بايت لأي سبب من الأسباب)، ثم عندما كنت تقسيم قطعة التي قدمها malloc كنت في نهاية المطاف مع مؤشرات الصغيرة المحايدة. سؤالي هو أن أنا دائما محاذاة كتل لبعض الحدود وإذا كانت الإجابة بنعم الذي؟

هل كانت مفيدة؟

المحلول

وX86 ستعمل دون التوافق، ولكن أداء أفضل عند محاذاة البيانات. المحاذاة ل<م> نوع هو sizeof عموما (<م> نوع )، وتصل إلى حد أقصى قدره 16 (بايت).

ولقد كتبت هذا البرنامج اختبار سخيفة لمجرد التأكد من (asuming malloc يعرف ما يفعل به)، ويعود 16 في مربع AMD64 بلدي. تقوم بإرجاع 8 عند تصنيف في وضع 32 بت:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int i;
    unsigned long used_bits = 0, alignment;

    for (i = 0; i < 1000; ++i) {
        used_bits |= (unsigned long)malloc(1);   /* common sizes */
        used_bits |= (unsigned long)malloc(2);   
        used_bits |= (unsigned long)malloc(4);
        used_bits |= (unsigned long)malloc(8);
        used_bits |= (unsigned long)malloc(16);
        used_bits |= (unsigned long)malloc(437); /* random number */
    }

    alignment = 1;
    while (!(used_bits & alignment)) {
        alignment <<= 1;
    }

    printf("Alignment is: %lu\n", alignment);
    return 0;
}

نصائح أخرى

والتوافق السليم هي على الأقل مفيدة (أداء الحكمة) على معظم تطبيقات إلى x86 (ونوع من المواءمة إلزامي في الواقع في أبنية أخرى). قد تسأل (مثل calloc لا) لزوج من الحجج، وحجم العناصر في بايت وعدد من العناصر، بدلا من واحد فقط (في حجم بايت، مثل malloc لا)؛ ثم يمكنك محاذاة في جوهرها (باعتقال أحجام كتلة) إلى السلطة القادمة، أعلى من 2 أعلاه حجم العنصر (ولكن التحول إلى مضاعفات 16 بايت فوق 16، لا تبقي مضاعفة إلى الأبد، تماما مثل توصيderobert ويفسر! -). بهذه الطريقة، إذا كان المتصل يريد فقط N بايت ث / س أي محاذاة ولا الحشو، فإنها يمكن أن تسأل دائما عن N البنود من 1 بايت لكل (تماما كما تفعل مع calloc ولنفس السبب، -).

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