زبان برنامه‌نویسی D بخش ششم

نحوه برقراری ارتباط اشیای دارای جمع آوری زباله با کد بیرونی

جمع آور زباله در سگمنت داده ایستا ، پشته ها و محتویات رجیستر هر thread ، به دنبال ریشه ها می گردد . اگر تنها ریشه یک شیئ بیرون از آنها باشد ، جمع آور زباله آن را از بین می برد و حافظه را آزاد می‌سازد .
برای اجتناب از این واقعه باید :

  1. ۱. ریشه دسترسی به یک شیئ را در جایی نگهداری کنیم که جمع آور زباله در آن جا به دنبال ریشه می گردد .
    ۲.به شیئ مجدداً توسط تخصیص دهنده کد خارجی یا کتابخانه های زمان اجرای C یعنی malloc/ free ، حافظه تخصیص دهیم .

اشاره گرها و جمع آور زباله
الگوریتم های جمع آوری زباله بستگی دارد به اشاره گرهایی که به چیزی در حال اشاره ‌اند و غیر اشاره‌گرها که به چیزی اشاره نمی کرده اند . بدین منظور دستورات زیر که در C غیر معمول نیستند باید به دقت در D از آنها خودداری شود :
۱. اشاره گرها را با xor کردن آنها با مقادیر دیگر مخفی نکنید مانند اشاره گر xor شده حقه‌ی لیست پیوندی در C . از حقه‌ی xor برای جا به جا کردن مقادیر دو اشاره گر استفاده نکنید .
۲. اشاره گرهای به مقادیر صحیح را توسط cast یا دیگر حقه ها ذخیره نکنید ، چون جمع آوری زباله انواع غیر اشاره‌گر را برای یافتن ریشه های دسترسی بررسی نمی کند .
۳. از مزیت هم ترازی اشاره گرها برای ذخیره فلگهای بیتی در بیتهای سطح پائین یا بیتهای سطح بالا استفاده نکنید .
۴. مقادیر صحیح را در اشاره گرها نگهداری نکنید .
۵. مقادیر جادویی را در اشاره گرها ذخیره نکنید به غیر از null .
۶. اگر شما باید یک مکان نگهداری خاص را بین انواع اشاره گر و غیر اشاره‌گر به اشتراک بگذارید از union استفاده کنید تا جمع آور زباله تکلیف خودش را در آن مورد بداند .
در حقیقت تا جایی که می شود از اشاره گرها استفاده نکنید . D دارای امکاناتی مانند اشیاء مرجع ، آرایه های پویا و جمع آوری زباله است که نشان می دهد که اغلب اشاره گرهای آشکارا ، متروک و بلااستفاده خواهند بود . اشاره گرها برای ارتباط موفق با API های C و بعضی کارهای کیمیاگرانه در D فراهم شده اند .
ساختمانها و یونیون ها
نحوه اعلان :
Tag { DeclDefs } Tag Identifier { DeclDefs } Tag Identifier ; Tag: struct / union
شبیه C کار می کنند با تفاوتهای زیر :
۱. بدون فیلد های بیت
۲. نحوه آرایش به طور آشکار قابل مشخص کردن است .
۳. اعلان هایی مانند ; struct ABC x ،مجاز نیستند بنویسید ; ABC x .
۴. ساختمانها یا یونیون های بی نام می توانند عضوی از ساختمانها یا یونیون های دیگر باشند .
۵. انتساب دهنده های پیش فرض اولیه برای اعضا پشتیبانی می شود .
۶. توابع عضو و اعضای استاتیک مجاز است .
ساختمانها و یونیون ها به معنی اجتماع ساده داده ها یا راهی برای رنگ و آب دادن به یک ساختمان داده می باشد ، علاوه بر سخت افزار یا یک نوع خارجی ، انواع خارجی می توانند توسط API سیستم عامل یا یک فرمت فایل تعریف شوند . خصوصیات شیئ گرا نیز با نوع داده کلاس فراهم شده اند .


انتساب اولیه استاتیک ساختمان ها
به اعضای ساختمان استاتیک به طور پیش فرض مقدار صفر انتساب داده می شود و به مقادیر ممیز شناور مقدار NAN . اگر یک انتساب دهنده اولیه‌ی استاتیک فراهم شود ، اعضا به وسیله نام عضو ، علامت ':' و املای دستور ، انتساب اولیه می شوند . در ضمن ممکن است اعضا به هر نحو انتساب اولیه شوند .
struct X { int a; int b; int c; int d = 7;} static X x = { a:1, b:2}; // c is set to 0, d to 7 static X z = { c:4, b:5, a:2 , d:5}; // z.a = 2, z.b = 5, z.c = 4, d = 5<DD DIR="RTL" STYLE="margin-bottom: 0.5cm; text-align: right"> انتساب اولیه‌ی استاتیک یونیون ها
یونیون ها به طور آشکار مقدار دهی اولیه می شوند :
union U { int a ; double b ; } static U u = { b : 5.0 } ; // u.b = 5.0
دیگر اعضای یونیون که انتساب دهنده را جای می گذارند ولی فضای بیشتری اشغال می کنند مقدار صفر می گیرند .
Enums اعلان : EnumDeclaration: enum identifier { EnumMembers } enum { EnumMembers } enum identifier ;

Enum کاربرد معمولی ماکروی define# در زبان C را برای تعریف مقادیر ثابت جایگزین میکند.
Enum ها همچنین می توانند بی نام باشند که در آن مورد به سادگی ثابت های مجتمع را تعریف می کنند و یا دارای نام باشند که مقدمه یک نوع جدید خواهند بود . اعلان زیر :
enum { A, B, C } // anonymous enum
مقادیر ثابت A=0 , B=1 , C=2 که معادل دستورات زیر است را تعریف میکند :
const int A = 0; const int B = 1; const int C = 2;
در حالی که اعلان زیر:
enum X { A, B, C } // named enum
نوع جدید X با مقادیر X.A=0 , X.B=1 , X.C=2 تعریف می کند.
Enum ها باید حداقل دارای یک عضو باشند . اگر برای یک عضو Enum یک عبارت ریاضی فراهم شده باشد ارزش عضو مذکور برابر حاصل عبارت است و عضو بعدی Enum دارای ارزش عضو قبلی به علاوه یک است . مثلاً در مورد زیر :
Enum { A , B = 5 + 7 , C, D = 8 , E }
داریم A = 0 , B = 12 , C = 13 , D = 8 , E = 9
صفات Enum
کوچکترین عضو min
بزرگترین عضو max
سایز نگهداری ارزش عضو size


مقدار دهی اولیه‌ی Enum :
در غیاب یک مقدار دهنده به صورت آشکار ، یک متغیر Enum دارای مقدار اولین عضو است .
Enum X { A = 3 , B,C }
مقدار X برابر 3 می شود .// ; X x