لماذا نستعمل packed عندما نعرف نوع ؟
#1
السلام عليكم ورحمة الله وبركاتة

لماذا نستخدم التعليمة packed عندما نعرف الأنواع , فأنا أراها في بعض الكلاسات تستعمل والبعض الأخر ﻻ
لذلك سؤالي ماذا تعمل و وأين تستعمل ؟

هذه أحد الأمثلة التي وجدتها في أحد الكلاسات :
PHP كود :
TBGRAPixel = packed record
    blue
, green, red, alpha: byte;
  
end; 

كذلك يوجد نقطة آخرى وهي
PHP كود :
$PackRecords 
مذا تعمل ومتى تستعمل ؟
وهذا مثال وجدته عليها
PHP كود :
{$PackRecords 1}  
     
Trec2 = Record  
       A 
: Byte;  
       
B : Word;  
       
end;  
     {
$PackRecords 2} 
وجدت بعذ التوضيح حول هذه النقطة لكني لم افهمها جيدا :
إقتباس :http://lazarus-ccr.sourceforge.net/fpcdo...fsu15.html

ملاحظة : أستعمل Lazarus
الرد
#2
الفر بين Record العادي و Packed Record أن الأخير حجمه بالبايت أقل من الأول حتى لو قمت بحجز نفس أنواع البيانات ونفس عدد المتغيرات فملا

كود :
type c = Packed Record a : Integer; b : String[4]; End; type x = Record a : Integer; b : String[4]; End;
هي نفس المتغيرات وأنواع البيانات والكن عندما تقوم بالاستفسار عن الحجم تجده مختلف

كود :
procedure TForm8.Button1Click(Sender: TObject); var s : c; s1 :x; begin ShowMessage(IntToStr(SizeOf(s))+' - '+IntToStr(SizeOf(s1))) end;
سيعطيك 12 و 9 بايت
الرد
#3
جويت خيراً على التوضيح , ولكن في هذا السطر :
إقتباس :Free Pascal supports also the ’packed record’, this is a record where all the elements are byte-aligned
ماذا يقصد بـ byte-aligned ؟
الرد
#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)
فهمت ؟ استفسار ؟
الرد
#5
استاذ B.M.AbdelAziZ
لماذا لا تقوم بكتابة كتاب يتحدث عن أساسيات لغة دلفي - باسكال ، لعلنا نستفيد من خبرتك الكبيرة في هذا المجال.
الرد
#6
فبتالي نسنتنتج انه إذا اردت عمل محاذات سيتم إستهلاك الرام اكثر .. بينما يرجع ذلك بالفائدة على سرعة التعامل مع المتغيرات في الذاكرة داخل الـ cpu
والعكس صحيح ؟
الرد
#7
إقتباس :لماذا لا تقوم بكتابة كتاب يتحدث عن أساسيات لغة دلفي - باسكال
صراحة كنت قد شرعت في الكتابة لاوبل اتفقت مع احد دور النشر لنشر الكتاب لكنني لم اكمله في المدة المحددة، كان هذا قبل صدور XE وبما انني لم اعد اتابع اصدارات دلفي الجديدة لم اكمل.
إقتباس :والعكس صحيح ؟
نعم، فقط الهدف ليس الذاكرة الحية RAM
الCompiler يقوم بعمل Optimization للكود الناتج اما للحجم Code Size او السرعة Speed وليس الاثنين معا طبعا هناك استثناءات وحالات خاصة، اتحدث عن الِِِCompiler عامة وليس دلفي أو Free Pascal
الرد


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


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