تكرار السؤال: …
الإجابة المختصرة
يقوم المحرك بإضافة حشوات بايتية فارغة (Padding) لمحاذاة المتغيرات مع حدود الذاكرة الطبيعية؛ وإعادة ترتيب الخصائص من الأكبر للأصغر يقلل حجم الـ struct.
الشرح
في معالجات 64-bit، تتطلب الأرقام 8-byte أن تبدأ عند عنوان يقبل القسمة على 8. إذا كان لديك struct يحتوي على: byte (1 byte), long (8 bytes), byte (1 byte)، سيضيف المترجم 7 بايت حشوة بعد البايت الأول و7 بايت في النهاية، فيصبح الحجم الإجمالي 24 بايت! إذا أعدت ترتيبها: long ثم byte ثم byte، سيهبط الحجم إلى 16 بايت فقط، مما يوفر ملايين البايتات في المصفوفات الضخمة.
مثال بالكود
// حجمه 16 بايت بدلاً من 24 بفضل الترتيب الأمثل
[StructLayout(LayoutKind.Sequential)]
public struct OptimizedStruct {
public long BigNumber; // 8 bytes
public byte Flag1; // 1 byte
public byte Flag2; // 1 byte
// 6 bytes padding
}أخطاء شائعة
- تجاهل محاذاة الذاكرة عند تبادل هياكل البيانات مع مكتبات C عبر P/Invoke.