سؤال

أنا أكتب لغة برمجة ، وعندما صادفت هذا السؤال, كان تفكيري المباشر هو أن اللغات يجب أن تعمل على تحسين المنطقية في أعلام بت المبرمج. هذا من شأنه أن يحافظ على كل فوائد السرعة واستخدام الذاكرة الفعال مع إزالة عبء الصيانة وإمكانيات الأخطاء الناجمة عن التلاعب البت الأكثر تعقيدًا.

الحالة الوحيدة التي قد ترغب في عدم الحصول عليها من هذا التحسين هي إذا كان لديك موقف لا يوجد فيه مجموعة واحدة فقط من المنطقيين. في الأساس ، إذا كان لديك 8 bits for flags + 8 bit masks * 8 bits per bit mask = 72 bits بدلاً من 8 booleans * 8 bits per boolean = 64 bits. ولكن بمجرد أن يكون لديك حتى نسختين من المنطقيين ، يصبح الأمر كذلك 2 copies * 8 bits for flags + 8 bit masks * 8 bits per bit mask = 80 bits عكس 2 copies * 8 booleans * 8 bits per boolean = 128 bits. يبدو أن الحالات القليلة التي سيكون فيها المنطقون أكثر تخزينًا سيكون من السهل اكتشافه حتى يتمكن المرء ليس تطبيق التحسين.

هل هناك أي سبب من أن اللغات لا تدعم هذا التحسين؟ نظرت حولي ولا يبدو أن أي لغات تفعل (قد لا أنظر في الأماكن الصحيحة).

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

المحلول

لقد رأيت أشخاصًا يقومون بذلك بلغة التجميع ، حيث يقومون بتعبئة منطقية في كلمات لتوفير المساحة ، ثم كتابة الكثير من التعليمات للحصول على/ضبط البتات.

من الواضح أن هناك مفاضلة في السرعة والذاكرة بين التعبئة المنطقية وعدم تعبئتها ، وأنا شخصياً خجول من مترجم يحاول أن يقرر ذلك بالنسبة لي.

نصائح أخرى

ج يفعل ...

#include <stdio.h>

typedef struct foo_s {
    unsigned char field1 :1;
    unsigned char field2 :1;
    unsigned char field3 :4;
    unsigned char field4 :2;
} foo_t;

int main() {
    printf("%d\n", sizeof(foo_t));
    return 0;
}

عند الجري ، يتم تعبئة هذه الحقول الأربعة في بايت واحد:

$ gcc -Wall -o bittest bittest.c 
$ ./bittest 
1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top