كيف يمكن أنا وضعت 3 بايت السفلية من 4 بايت طويلة في حين ترك بايت كبار سليمة؟

StackOverflow https://stackoverflow.com/questions/1806764

  •  05-07-2019
  •  | 
  •  

سؤال

ورمز ذات الصلة هو:

typedef unsigned long int chunk_head;

typedef struct malloc_chunk
{
    // Contains the size of the data in the chunk and the flag byte.
    chunk_head      head;

    // Deliberately left unsized to allow overflow. 
    // Contains the payload of the chunk.
    unsigned int    data[];
};

وفقط على سبيل المثال، فإن "الحصول على" ماكرو هو:

//Get the size of the data contained within the chunk.
#define GET_CHUNK_SIZE(chunk) ((chunk.head) & 0xFFFFFF)

والبايت العلوي أنا باستخدام بت للاعلام - "inuse" و "يمكن تلاحمت"، وأي منها الإضافية التي أجد أن تكون مفيدة

.

والآن بعد أن انتهيت من تقديم المعلومات الأساسية، كما ذكرت في العنوان، ولست بحاجة إلى أن تكون قادرة على تغيير أقل 3 بايت إلى مدى ضخامة قطعة هي. وكان بلدي غريزة أولية لأحادي المعامل AND رأس مع حجم، نظرا لأنه سيتم محاذاة بشكل صحيح، ولكن بعد ذلك أدركت أنه قد الكتابة فوق بايت العلم أيضا، لأنه إرفاق مسبقا أصفار تلقائيا حتى حجم مطابقة لفترة طويلة. أنا لست حتى متأكد من أنك <م> يمكن أحادي المعامل AND عدد صحيح وطويلة. على أي حال، تساعد على تقدير كبير.

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

المحلول

وماذا عن:

head = (head & 0xff000000) | (new_size & 0x00ffffff)

نصائح أخرى

لسبب معظم الردود التي تلقيتها ذلك يصر حتى الآن على تجتاح مسألة حجم الفائض المحتملة تحت السجادة، أي أنها "و" حجم قطعة مع 0x00FFFFFF نبذ بالتالي بهدوء بت حجم المفرطة (إن وجدت) ومن ثم الانتقال لكتابة جزء الذيل معنى تماما حجم في الحقل. أنا لا أعرف لماذا أي شخص يفعل شيئا من هذا القبيل.

والرمز أكثر معقولية قد تبدو على النحو التالي

assert((size & 0xFF000000) == 0);
chunk.head = (chunk.head & 0xFF000000) | size;

وليس هناك سبب وجيه ل"و" الحجم مع 0x00FFFFFF. يجب عليك إما إجهاض أو على الأقل تأكيد على حجم المفرط، وليس تجاهل بهدوء الزائدة.

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

typedef struct chunk_head {
  unsigned size:24;
  unsigned inuse:1;
  unsigned cancoalesce:1;
  // Room for 6 more...
};

typedef struct malloc_chunk {
  struct chunk_head head;
  int data[];
};

chunk.head = (chunk.head & ~0xffffffL) | (new_lower_bits)

// retain the old top 8 bits
chunk.head &= 0xFF00000000

// set the lower 24 bits
chunk.head |= (0x00FFFFFF & new_bits)
#define SET_CHUNK_SIZE(chunk, size) (chunk.head = (chunk.head & 0xFF000000) | (size & 0x00FFFFFF))

هل هذا ما كنت تعني أو لم أفتقد شيئا؟

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