الدرس 17: union والفرق بينه وبين struct
يمنح struct لكل حقل ذاكرته الخاصة — لكن للغة C أيضًا توأمًا مقتصدًا: union. في union تتشارك جميع الأعضاء المنطقة نفسها من الذاكرة، لذا يكون واحد منها فقط 'حيًّا' في أي لحظة. يشغل union Value { int i; double d; }; حجم أكبر أعضائه (8 بايت من أجل double)، بينما يشغل struct مماثل ما يقارب مجموع أعضائه (
الـ struct شقة فيها غرفة لكل ساكن؛ أما الـ union فغرفة واحدة بسرير واحد — عندما يدخل ساكن جديد، يُطرد السابق ببساطة. في أي لحظة يسكن هناك واحد بالضبط.
- union (اتحاد)
- نوع تتشارك جميع أعضائه المنطقة نفسها من الذاكرة — عضو واحد فقط صالح في كل مرة.
- ذاكرة مشتركة (تداخل)
- تبدأ جميع أعضاء union من الموقع نفسه؛ الكتابة إلى واحد تدهس بتات الآخرين.
- sizeof الخاص بـ union
- حجم أكبر الأعضاء. في struct، بالمقابل — ما يقارب مجموع الأعضاء، وأحيانًا أكثر بسبب padding.
- padding (حشو)
- بايتات فارغة يضيفها المترجم إلى struct لمحاذاة الحقول في الذاكرة — لذا يكون sizeof أحيانًا أكبر من مجموع الحقول.
- وسم النوع (tag)
- حقل مرافق (من نوع int أو enum) يُحفظ بجوار union لتذكُّر أي عضو صالح حاليًا.