لماذا نستعمل packed عندما نعرف نوع ؟
#4
إقتباس :ماذا يقصد بـ byte-aligned ؟
محاذات حجم الحقل/المتغير/البيانات aligns data

تابع، هذا جزء من الكود بأول مشاركة يقوم بتعريف نوع جديد Trec2
كود :
Type Trec2 = Record A : Byte; B : Word; end;
لو قمت بتعريف متغير V1 من النوع الجديد Trec2
كود :
var V1:Trec2;
كم سيكون حجم V1 ؟
تقول A من نوع Byte حجمه 1 و B من نوع Word حجمه 2
هو ما يساوي 1+2 اي 3 Bytes حروف بالذاكرة
الى هنا كل شيئ عادي... لا، خطأ، اذا استخدمنا SizeOf لمعرفة الحجم ستكون النتيجة 4
الCompiler سيقوم بمحاذات حجم المتغر A من 1 الى 2 ويصبح الحجم 2+2 يساوي 4
لماذا قام الCompiler بذلك ؟ لان التعامل معها 4 اسرع من التعامل معها ك3 وهذا ما يدخل في باب الOptimization لان التعامل مع البيانات المحاذات اسرع!

الان جرب ما يلي، ضف الى الشيفرة المصدرية قبلها او الاسن فوقها كلها ما يلي
كود :
{$Align Off}
تجد ان استدعاء SizeOf يعيد 3
يعني الCompiler لم يقم بالمحاذات
عندما تكتب Packed فانك ترشد الCompiler ان يستخدم اصغر حجم ممكن وبالتالي لا يقوم بالمحاذات
كود :
{$Align On} هي نفسها {$A+} {$Align Off} هي نفسها {$A-}
توثيق نسخة دلفي الحالية XE7 يقول
إقتباس :
Type
Switch

Syntax
{$A+}, {$A-}, {$A1}, {$A2}, {$A4}, {$A8} or {$A16} {$ALIGN ON}, {$ALIGN OFF}, {$ALIGN 1}, {$ALIGN 2}, {$ALIGN 4}, {$ALIGN 8} or {$ALIGN 16}

Default
{$A8} {$ALIGN 8}

Scope
Local
docwiki.embarcadero.com/RADStudio/XE7/en/Align_fields_(Delphi)
فهمت ؟ استفسار ؟
الرد


الردود في هذا الموضوع
لماذا نستعمل packed عندما نعرف نوع ؟ - بواسطة محمد عبد العزيز - 09-02-2015, 01:54 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم