(Collection Grabage) کنترل منابع
کاملاً با جمع آوری زباله ھمراه است. تجربه شھودی بیان می کند که تعداد زیادی D تخصیص حافظه در
برای کنترل رھاسازی حافظه لازم است . با جمع آوری زباله زبان بسیار ساد هتر C++ از خصوصیات
می شود.
حکمی ھست که م یگوید جمع آوری زباله برای جوجه برنامه نویسھا و تنب لھا است. من به یاد دارم
قابل C نیست که در C++ گفته می شد. بعد از ھمه ھیچ چیز در C++ زمانی را که این حرف در مورد
انجام نباشد یا در اسمبلر برای آن منظور.
C++ و C خصوصیات جمع آوری زباله کد خسته کننده پیگیری تخصیص حافظه ھای مستعد خطا که در
لازم است را حذف می کند. این نه تنھا بدین معناست که گسترش برنام هھا سریعتر انجام م یگیرد و
ھزینه ھای نگھداری کاھش می یابد بلکه برنامه به میزان زیادی در دفعات اجرا سریعتر است.
کنترل حافظه ساده و واضح
می توانند در کلاسھای delete و new یک زبان دارای جمع آوری زباله است ، اعمال D با وجود اینکه
خاص اجرا شوند ھمانگونه که یک تخصیص دھنده سفارشی به کار م یرود.
RAII
از D ، یک تکنیک پیشرفته گسترش نر مافزار برای کنترل تخصیص منابع و آزادسازی آنھا است RAII
در یک روش کنترل شده قابل پیش بینی که مستقل از چرخه جم عآوری زباله است پشتیبانی RAII
می کند .
کارایی
توده سبک وزن
و نیز C را پشتیبانی م یکند ھم برای سازگاری با ساختمان داد هھای C ساختمان ھای سبک ساده D
به خاطر اینکه آنھا در جاھایی که قدرت کامل کلاسھا کارایی ندارد مفیدند.
Assembler Inline
درایور سخت افزار ، کاربردھای سیستمی با کارایی بالا ، سیستم ھای تعبیه شده و کدھای خصوصی
شده بعضی وقتھا نیاز به غرق شدن در زبان اسمبلی دارند تا کار انجام شود . در حالی که پیاده سازی
نیاز به کارگیری اسمبلر خطی ندارند ، این خصوصیت تعریف شده و قسمتی از زبان است . D ھای
اغلب نیازھای کد اسمبلی به وسیله این بخش قابل برآوری است که نیاز به اسمبلرھای جداگانه و
ھا را مرتفع می سازد . DLL
از پردازش درگاھھای C توابع اصلی را شبیه به پشتیبانی ذاتی D ھمچنین بسیاری از پیاده سازی ھای
ورودی خروجی ، دسترسی مستقیم به عملیاتھای ممیز شناور و … پشتیبانی می کند .
قابلیت اعتماد
یک زبان پیشرفته باید برنامه نویس را در رفع تمامی اشکالات از کد یاری کند . این کمک به چندین
صورت می تواند ارائه شود . از آسان سازی کاربرد تکنیکھای قدرتمند تر ، تا گوشزد کردن کد غلط
آشکارا توسط کمپایلر و کنترل زمان اجرا .
( Contracts ) معاھدات
یک تکنیک انقلابی برای کمک به مطمئن شدن از صحت ( B.Meyer طراحی به وسیله کنترات ( ساخته
شامل پیش شرطھای توابع ، پس شرطھای توابع ، یکسانی ھای D زبان DBC برنامه است و نسخه
کلاس و کنتراکتھای ثابت کننده است .
آزمایش واحد
آزمایش قسمتھا می تواند به یک کلاس افزوده شود طوری که به صورت خودکار در لحظه شروع اجرای
برنامه اجرا شوند . این در ھشدار دادن اینکه پیاده سازی کلاس در ھر بار ساخته شدن ، سھو اً با
شکست مواجه نشده است مفید است آزمایش واحد قسمتی از کد کلاس را تشکیل می دھد . ایجاد
آنھا یک قسمت طبیعی پر دارد گسترش کلاس خواھد شد برخلاف پشت گوش انداختن کد تمام
شده از گروھھای آزمایش.
آزمایش واحد در دیگر زبانھا قابل انجام است اما نتیجه جالب از آب در نمی آید زیرا این زبانھا با این فکر
است . برای توابع کتابخانه ای به خوبی D عجین نیستند . آزمایش واحد یک خصوصیت اصلی و بارز در
عمل می کند ھم ضمانت می کند که تابع حقیقتاً کار می کند و ھم با مثال بیان می کند که تابع
موجود در اینترنت برای C++ چگونه کار می کند . خیل کثیر کدھای منشاء کاربردی و کتابخانه ھای
دانلود را در نظر بگیرید . چه تعداد از آنھا با تستھای کلی ھمراه است ( تست واحد را ھم در نظر
نگیرید ) ؟ کمتر از یک درصد . روش معمول این است که اگر کامپایل شده اجرا ھم می شود و شگفت
زده خواھیم شد اگر ھشدارھای کامپایلر اشکالات واقعی باشند .
را به مراتب به بھترین زبان برای نوشتن قابل اعتماد و D ، در کنار طراحی با کنتراکت ، آزمایش واحد
کاربردھای سیستمی قدرتمند تبدیل می کند.
خصوصیات و شرح اشکال زدایی
که در زمان کامپایل قابل فعال یا غیر فعال . ( debug ) اکنون اشکال زدایی بخشی از املای زبان است
یک قابلیت تشخیص سازگار debug شدن است بدون کاربرد دستورات پیش پردازنده یا ماکروھا . املای
- استوار و قابل حمل و قابل فھم را فعال می کند که آیا کد منبع حقیقی قابل ایجاد در کامپایل اشکال
زدایی و کامپایل نھایی ھست ؟
پردازش استثناء
به کار رفته است . نیاز نیست که اشیای try – catch به جای مدل فقط finally – try – catch مدل برتر
پیاده سازی کنیم . ( destructor ) زائد ایجاد کنیم فقط برای اینکه معناھای نھایی را توسط مخرب
ھماھنگی و ھم زمانی
مبناھایی برای ساخت برنامه ھای چند رشته ای D برنامه سازی چند رشته ای متداولتر می شود و
فراھم می کند . ھم زمان سازی می تواند ھم در سطح متد و ھم در سطح شیئی انجام شود .
{.} ( ) synchronize int func
توابع ھمزمان شده ( سنکرون شده ) در ھر زمان فقط به یک رشته اجازه می دھند که آن تابع را اجرا
در اطراف قطعه ای از عبارات احاطه می کند و دسترسی به وسیله شیئی synchronix\ze کند . عبارت
یا به صورت عمومی را کنترل می کند .
پشتیبانی تکنیکھای قدرتمند
آرایه ھای دینامیک به جای اشاره گر ھا
متغییرھای ارجاعی به جای اشاره گر ھا
اشیای ارجاعی به جای اشاره گرھا
جمع آوری زباله به جای کنترل واضح و دستی حافظه
مبانی موجود برای ھمزمانی رشته ھا
عدم وجود ماکرویی که به طور غیر عمدی به کد آسیب بزند .
به جای ماکروھا inline توابع
کاھش وسیع نیاز به اشاره گرھا
سایز انواع مرکب واضح و مشخص است
عدم شک در مورد علامت دار بودن کاراکتر ھا
header عدم نیاز به دوبار اعلان در کد منبع و فایلھای
پشتیبانی واضح از تجزیه و تحلیل برای افزودن کد اشکال زدایی
قسمت چھارم D آشنایی با زبان
کنترل ھای زمان کامپایل
کنترل نوع قوی تر
• انتساب مقادیر به صورت واضح مورد نیاز است
• مجاز نبودن متغییرھای محلی به کار نرفته
• عدم ؛ خالی در بدنه حلقه ھا
• انتساب ؛ مقادیر بولی بر نمی گرداند
ھای متروک API • نپسندیدن
کنترل زمان اجرا
( ) assert • عبارات اثبات صحت
• کنترل مرزھای آرایه
switch تعریف نشده در استثنای case •
• استثنای خارج از حافظه
• ورودی ، خروجی و طراحی یکسان کلاس به وسیله کنتراکت
سازگاری
تقدم عملگر و قوانین سنجش
و قوانین تقدم آنھا را حفظ می کند ھمچنین ترتیب قوانین سنجش و قوانین تقدم . این C عملگرھای D
از اشکالات ریز که از ابتدای برنامه نمایان می شود جلوگیری می کند .
C ھای API دسترسی مستقیم به
را فراھم می سازد . C دارد ھمچنین دسترسی مستقیم به توابع C نوع داده ھای مطابق با D نه تنھا
ھیچ نیازی نیست که توابع بسته بندی شده نوشته شود یا کدی برای کپی کردن اجزای متراکم یک
توده به صورت یک به یک
C پشتیبانی از تمام نوع داده ھای
٩٩ را در بر می C ممکن است . این پشتیبانی تمام انواع C و یا کد کتابخانه ای C زبان API ارتباط با ھر
شامل توانایی صف بندی اعضای ساختمان است برای مطمئن شدن از سازگاری با فرمتھای D . گیرد
داده خارجی .
پردازش استثنای سیستم عامل
متصل به روشی است که سیستم عامل در سطح زیرین استثناھا را D مکانیسم پردازش استثناھای
در یک کاربرد پردازش می کند .
ابزارھای موجود را به کار می گیرد .
ایجاد می کند که باعث امکان استفاده از اسمبلرھا ، لینکرھا Object کد را در فرمت استاندارد فایل D
و دیگر تحلیل کننده ھای استاندارد به خوبی لینک exe فشرده سازھای ، ( debugger ) ، اشکال زداھا
کردن کدی که دیگر زبانھا نوشته شده است می شود.
کنترل پروژه
نسخه سازی
و # if # تکنیک D . به صورت درونی امکان ایجاد نسخه ھای متعدد از یک برنامه یا ھمان متن را دارد D
را جایگزین می کند . C پیش پردازنده ی end if
نبود ھشدار
ھشدارھایی برای کدھای نامطمئن تولید نمی کنند . کد یا توسط کامپایلر قابل قبول D کامپایلرھای
است یا نیست . این ھر گونه بحثی در این زمینه که آیا ھشدار خطایی صحیح است یا نه و نیز ھر
بحثی در این باره که با چه کنیم را از بین می برد . نیاز برای ھشدار کامپایلر نشان هی طراحی ضعیف
زبان است .
استھلاک
ھمان طور که در طول زمان رشد می کند بعضی کدھای کھنه کتابخانه با نو تر و نسخه بھتر جایگزین
می شود . نسخه قدیمی باید برای پشتیبانی کدھای به جا مانده از قبل موجود باشد اما می توانند
لقب مستھلک بگیرند . کدھایی که نسخه ھای مستھلک را به کار می گیرند به وسیله تعویض کمپایلر
برچسب غیر قانونی م یخ ورند که برای ابقای برنامه نویس برای نشان دادن ھر وابستگی به خصوصیات
مستھلک باعث آسانی است .
غربال اراتستن واحد اول ) ) D نمونه برنامه
import c.stdio ;
bit [8191] flags ;
int main ()
{ int i , count , prime , k , inter ;
print f(“ 10 iterations \n” );
for ( iter = 1 ; iter<=10 ; iter ++ )
{ count = 0 ;
flags [ ] = 1 ;
for ( i = 0 ; i < flags . length ; i ++ )
{ if ( flags [i] )
{ prime = i + i +3
k = i + prime
while ( k < flags . length )
{ flags , [ k] = 0 ;
k + = prime ;}
count + = 1}
print f ( “ % d primes” , count ) ;
return 0;
قسمت پنجم D آشنایی با زبان
مقادیر واسطه ممیز شناور
در بسیاری کامپیوترھا ، اعمال با دقت بالاتر بیشتر از اعمال با دقت کمتر وقت نمی گیرند .این باعث می
شوند که مفاھیم شمارشی بالاترین دقت ممکن را برای اعمال داخلی موقتی به کار ببرند . فلسفه
مورد بحث این است که زبان را به پائین مقسوم علیه سخت افزاری محدود کنیم بلکه آن را قادر به
بھره برداری از بھترین توانایی ھای سخت افزار مورد نظر نماییم .
برای اعمال ممیز شناور و مقادیر واسطه عبارت یک دقت بالاتر از نوع عبارت می تواند به کار رود . تنھا
حداقل دقت توسط نوع عملوندھا مشخص می شوند نه حداکثر دقت . نکته پیاده سازی : در ماشین
٨۶ برای نمونه انتظار می رود ( اما لازم نیست ) که محاسبات واسطه ای در دقت کامل x ھای اینتل
ھستاد بیتی که توسط سخت افزار پیاده سازی می شود انجام شود .
امکان دارد که در مسیر استفاده از مقادیر موقت و زیر عبارات معمول ، کد بھینه شده یک جواب دقیقتر
از کد بھینه نشده فراھم سازد .
الگوریتم ھا باید طوری نوشته شود که براساس حداقل دقت محاسبات کار کند . آنھا نباید در مواقعی
برخلاف float یا double که دقت واقعی بالاتر است از نظر عملکرد تنزل یابند یا شکست بخورند . انواع
نوع گسترش یافته فقط باید در موارد زیر به کار رود :
• کاھش مصرف حافظه برای آرایه ھای بزرگ .
. C • داده ھا و آرگومان ھای توابع سازگار با
انواع موھومی و مختلط
در زبان ھای موجود ، یک تلاش عجیب برای به زور جا دادن انواع مختلط در تسھیلات تعریف نوع موجود
مانند قالب ھا ، ساختمان ھا و … وجود دارد و تمام اینھا معمولاً در نھایت با شکست مواجه
می شوند .
شکست می خورند چون مفاھیم اعمال مختلط می تواند بسیار دقیق باشد و کامپایلر نمی داند که
برنامه نویس در تلاش برای انجام چه کاری است بنابراین نمی تواند پیاده سازی معنایی را بھینه نماید .
تمام این کارھا برای اجتناب از اضافه کردن یک نوع جدید انجام شده است . اضافه کردن یک نوع جدید
بدین معناست که کامپایلر می تواند تمامی مفاھیم اعمال مختلط را دقیق پیاده کند . پس برنامه نویس
می تواند بر یک پیاده سازی صحیح ( یا حداقل دارای ثبات ) اعداد مختلط اعتماد کند .
ھمراه بودن با یک بسته نوع مختلط برای یک نوع موھومی مورد نیاز است .یک نوع موھومی برخی از
پیامدھای ظریف معنایی را حذف می کند و کارآیی را بھبود می بخشد بدون اینکه مجبور به انجام
می i اعمال اضافی روی قسمت حقیقی واضح صفر ، باشیم . الفاظ موھومی دارای یک پسوند
باشند .
; i ١٫٣imaginary j =
ھیچ املای خاص لفظ مختلط وجود ندارد فقط یک نوع حقیقی و موھومی را با ھم جمع کنید :
; i٢+ ۴٫۵complex c=
افزودن دو نوع جدید به زبان کافی است از این رو انواع مختلط و موھومی دارای دقت توسعه یافته
ھستند . ھیچ نوع اعشاری مختلط و موھومی یا نوع دابل مختلط یا موھومی وجود ندارد ( توجه : راه
برای افزودن آنھا در آینده باز است اما مطمئن نیستیم مورد نیاز باشد ) .
اعداد مختلط دارای دو صفت خاصه ھستند :
re. . قسمت حقیقی را به عنوان گسترش یافته بدست می دھد
im. . قسمت موھومی را به عنوان عدد موھومی بدست می دھد
برای مثال :
c . re is 4.5
c . im is 2i
کنترل گرد کردن
املایی D . ٧۵۴ شامل توانایی تنظیم کردن چھار روش گرد کردن است IEEE حسابگر ممیز شناور
[ blah , blah , blah ] : خاص برای دسترسی به آنھا افزوده است
پرچمھای استثناء
٧۵۴ می تواند پرچمھای مختلف را براساس آن چه در یک محاسبه رخ داده IEEE حسابگر ممیز شناور
Reset / SET این پرچمھا می توانند به وسیله املای زبان .[ blah , blah , blah ] : است تنظیم نماید
شوند .
مقایسه ھای ممیز شناور
تعداد بیشتری که خاص D علاوه بر عملگرھای مقایسه معمولی < , < = , > , >= , == , != زبان
اعداد ممیز شناور است اضافه می کند .
مدیریت حافظه
ھر برنامه غیر جزیی نیاز به تخصیص و آزاد سازی حافظه دارد . ھر چه پیچیدگی ، اندازه و کارآیی برنامه
اختیارات متعددی در زمینه مدیریت D . ھا افزایش می یابد تکنیکھای مدیریت حافظه مھمتر می شوند
حافظه پیشکش می کند .
: D سه روش پایه تخصیص حافظه در
١- داده استاتیک : در سگمنت داده پیش فرض تخصیص می یابند .
تخصیص می یابند . CPU ٢- داده پشته : در پشته برنامه
جمع آوری زابله تخصیص می یابند . heap ٣- داده زباله جمع آوری شده : به صورت پویا در
این قسمت بعدی تکنیکھا را برای استفاده از آنھا توضیح می دھد به ھمراه برخی قابلیت ھای
پیشرفته:
copy – on – write ( رشته ھا ( و آرایه ھا
فرستادن یک آرایه به یک تابع را در نظر بگیرید و احتما لاً تغییر دادن آرایه و برگرداندن آرایه جدید . از آنجا
که آرایه ھا با ارجاع فرستاده می شوند نه با مقدار ، یک پیامد وخیم این است که محتویات آرایه از آن
کیست ؟ برای مثال تابعی که آرایه ای از کاراکترھا را به حروف بزرگ برمی گرداند .
char [] toupper ( char [] S )
int i ;
for ( i =0 ; i < S . length ; i ++ )
char ( ‘a’ <= c && c<=’z’ )
S[i] = c – ( cast (char) ‘a’ – ‘A’ );
Return S;
که فراخوانی شد تغییر ھم کرد شاید این اصلاً آن چیز مورد توقع نبود یا بدتر []S توجه کنید که نسخه
ممکن است تکه ای از حافظه فقط خواندنی باشد . []S آنکه
ھمواره توسط تابع ساخته می شد به طور ناکارا و بدون لزوم زمان حافظه برای S اگر یک کپی از
حروفی که خودشان بزرگ ھستند مصرف می شد .
است که یعنی یک کپی ساخته می شود اگر رشته ھا نیاز به copy – on – write راه حل پیاده سازی
تغییر دارند بعضی زبان ھای پردازنده رشته ھا این عمل را به عنوان پیش فرض انجام می دھند اما
ھزینه بسیار سنگین است .
۵ مرتبه بوسیله تابع کپی می شود. برای اینکه از این قرارداد به نحوی با abcdwF” “ در نتیجه آن رشته
حداکثر کارآیی استفاده شود باید به صورت واضح در کد ظاھر شود .
char [] toupper (char [] s)
int changed ;
int i ;
changed = 0 ;
for i=0 ; i <S-length ; i ++ )
char c – S[i ] ;
if (‘a’ <= c && c<= ‘z’ )
if ( ! changed )
char [] r = new char [ S.length] ;
r []= S ;
changed = 1 ;
S [i] = c – ( cast ( char ) ‘a’ – ‘A’ );
return S ;
phibo پروتکلی است که به وسیله توابع پردازش آرایه ھا در کتابخانه زمان اجرای copy – on – write
پیاده سازی شده است . D زبان
جمع آوری زباله
زبانی دارای جمع آوی زباله کامل می باشد . بدین معنی که ھیچ وقت نیاز به آزادسازی حافظه D
نیست . فقط به ھنگام نیاز حافظه را تخصیص دھید و جمع آور زباله به طور دوره ای تمام حافظه بی
استفاده را به توده حافظه آزاد برمی گرداند .
که به کنترل دستی حافظه ھنگام تخصیص و آزاد سازی آن عادت دارند C ++ , C برنامه نویسان
احتمالاً مزایا و تأثیر جمع آوری زباله یقین ندارند . تجربه ی پروژه ھای جدید که با در نظر گرفتن جمع
آوری زباله نوشته شده اند ھمچنین پروژه ھای موجود که به سبک جمع آوری زباله برگردانده شده اند
نشان می دھد که :
• برنامه ھای دارای جمع آور زباله سریعتر ھستند . این واضح است اما دلایلی قابل بیان است .
• شمارش در جاعات یک روش معمول برای حل مسائل تخصیص حافظه آشکار است . کد پیاده سازی
اعمال اضافه و تفریق ھر جا که انتساب صورت می گیرد یکی از دلایل کندی است .
• پنھان کردن کد مذکور در پس کلاسھای اشاره گر ھوشمند به افزایش سرعت کمک نمی کند .
( روش شمارش ارجاعات به ھیچ وجه راه حل عمومی نیست جایی که ارجاعات حلقه ای ھرگز حذف
نمی شوند . )
• مخرب ھای کلاس برای آزادسازی منابع مورد نیاز یک شیئی به کار می رود . برای اغلب کلاسھا این
منابع ، حافظه تخصیص یافته است . با جمع آوری زباله اغلب مخرب ھا خالی می شوند و در نھایت
می توانند دور انداخته شوند .
• تمام مخرب ھایی که حافظه را آزاد می کنند می توانند معنی دار شوند در مواقعی که اشیاء ، بر روی
پشته تخصیص حافظه می یابند . برای ھر کدام مکانیزمی باید در نظر گرفته شود طوری که اگر یک
استثناء رخ داد تمام مخربھا از ھر چارچوب فراخوانی شوند تا ھر حافظه تخصیص یافته برای آنھا را رھا
کنند . اگر مخرب ھا نامربوط شوند ھیچ نیازی برای در نظر گرفتن چارچوب ھای خاص پشته برای
پردازش استثناھا نیست در نتیجه کد سریعتر اجرا می شود .
• تمام کدھای لازم برای مدیریت حافظه می تواند برای تکامل جزیی اضافه شود . برنامه بزرگتر کمتر در
حافظه اصلی و بیشتر آن در حافظه مجازی قرار می گیرد و آرامتر و کندتر اجرا می شود .
جمع آور حافظه ھنگامی صورت می گیرد که حافظه تنگ و کم شود . تا وقتی حافظه جا ××××× •
دارد برنامه در حداکثر سرعت ممکن اجرا می شود و ھیچ وقتی برای آزاد کردن حافظه ، صرف نمی
کند .
• جمع آورنده ھای زباله مدرن ، اکنون به مراتب پیشرفته تر از قبلی ھا و کندترھا ھستند . جمع آورنده
ھای تولید کننده و کپی کننده قسمت عمده ناکارایی الگوریتم ھای جارو کردن و اختصاص دادن را حذف
می کنند .
• جمع آورنده ھای زباله مدرن فشرده سازی توده حافظه را انجام می دھند . فشرده سازی توده
مراقب است که تعداد صفحاتی که به طور فعال به وسیله یک برنامه ارجاع شده اند را کاھش دھد
بدین معنی که دسترسی ھای حافظه احتمالاً بیشتر به حافظه می رسند تا به مبادله حافظه .
• جمع آورنده ھای زباله حافظه استفاده شده را اصلاح می کنند . بنابراین به رخنه ھای حافظه – که
باعث می شوند برنامه ھای با اجرای طولانی مدت آن قدر حافظه مصرف کننده تا سیستم ھنگ کند -
تن در نمی دھد .
• برنامه ھای دارای جمع آور زباله دارای اشکالات کمتر یافتن اشاره گرھا می باشند به این خاطر که
ھیچ ارجاع سرگردان به حافظه آزاد شده نمی ماند .
• برنامه ھای دارای جمع آور زباله برای گسترش و اشکال زدایی سریعترند . چون ھیچ نیازی برای
گسترش ، اشکال زدایی ، امتحان ، یا ابقاء که آزاد سازی آشکار وجود ندارد .
• برنامه ھای دارای جمع زباله به طور معنی داری کوچکترند چون ھیچ که آزادسازی حافظه وجود ندارد
و از این رو نیازی به پردازشگرھای استثناھا برای آزاد سازی حافظه وجود ندارد .
• جمع آوی زباله یک نوشداروی ھم کاره نیست بعضی اشکالات ھم دارد :
• وقتی یک مجموعه برنامه ھمزمان اجرا می شود قابل پیشگویی نیست بنابراین برنامه به طور دلخواه
می تواند مکث کند.
• زمانی که برای اجرای یک مجموعه منصرف می شود نامحدود است با اینکه در عمل بسیار کوتاه
است اما ضمانتی وجود ندارد .
• تمام رشته ھای اجرا به غیر از رشته جمع آوری زباله در حالی که جمع آوری در جریان است باید
مکث کند .
نحوه برقراری ارتباط اشیای دارای جمع آوری زباله با کد بیرونی:
جمع آور زباله به دنبال ریشه ھا د سگمنت داده ایستا و پشته ھا و محتویات رجیستر ھر رشته ی اجرا
می گردد. اگر تنھا ریشه یک شیئی بیرون از آنھا باشد ، جمع آور زباله آن را از بین می برد و حافظه
را آزاد می سازد.
برای اجتناب از این واقعه باید:
ریشه دسترسی به یک شیئی را در جایی ابقا کنیم که جمع آور زباله در آن جا به دنبال ریشه می
گردد .
C به شیئی مجدداً توسط تخصیص دھنده که خارجی یا کتابخانه ھای زمان اجرای
حافظه تخصیص دھیم . ، ( ( malloc/free
اشاره گرھا و جمع آور زباله
الگوریتم ھای جمع آوری زباله بستگی دارد به اشاره گرھایی که به چیزی در حال اشاره اند و غیر
غیر معمول نیستند C اشاره گرھا که به چیزی اشاره نمی کرده اند . بدین منظور دستورات زیر که در
از آنھا خودداری شود : D باید به دقت در
شده حقه ی لیست xor کردن آنھا با مقادیر دیگر مخفی نکنید مانند اشاره گر xor ١) اشاره گرھا را با
برای جا به جا کردن مقادیر دو اشاره گر استفاده نکنید . xor از حقه ی . C پیوندی در
یا دیگر حقه ھا ذخیره نکنید چون جمع آوری زباله انواع cast ٢) اشاره گرھای به مقادیر صحیح را توسط
غیر اشاره گر را برای یافتن ریشه ھای دسترسی بررسی نمی کند .
٣) از مزیت ھم ترازی اشاره گرھا برای ذخیره فلگھای بیتی در بیتھای سطح پائین یا بیتھای سطح بالا
استفاده نکنید .
۴) مقادیر صحیح را در اشاره گرھا نگھداری نکنید و
. null ۵) مقادیر سحر آمیز را در اشاره گرھا ذخیره نکنید به غیر از
۶) اگر شما باید یک مکان نگھداری خاص را بین انواع اشاره گر و غیر اشار هگر به اشتراک بگذارید از
استفاده کنید تا جمع آور زباله تکلیف خودش را در آن مورد بداند . union
دارای خصوصیات است که نشان می D . در حقیقت تا جایی که می شود از اشاره گرھا استفاده نکنید
دھد که اغلب اشاره گرھای آشکارا ، متروک و بلااستفاده خواھند بود . مانند اشیاء مرجع ، آرایه ھای
و بعضی کارھای کیمیاگرانه پدید C ھای API پویا و جمع آوری زباله . اشاره گرھا برای ارتباط موفق با
آمده بودند .
ساختمانھا و یونیون ھا
Aggregate Declaration
کار می کنند با تفاوتھای زیر : C شبیه
١) بدون فیلد ھای بیت
٢) ھم ترازی به طور آشکار قابل مشخص کردن است .
٣) بدون فضای نام برچسب جداگانه – نام برچسب ھا در حوزه کنونی می باشند .
; ABC x : مجاز نیستند بنویسید ; struct 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
انتساب اولیه ی استاتیک یونیون ھا
یونیون ھا به طور آشکار مقدار دھی اولیه می شوند :
union U { int a ; double b ; }
static U u = { b : 5.0 } ; // u.b = 5.0
دیگر اعضای یونیون که انتساب دھنده را جای می گذارند ولی فضای بیشتری اشغال می کنند مقدار
صفر می گیرند .
Enums
Enum اعلان
اعضا { enum identifier {
اعضا { enum {
enum identifier ;
را با ثبات ھای تعریف جایگزین می کنند . define # ھا کاربرد معمولی ماکروھای Enum
ھا ھمچنین می توانند بی نام باشند که در آن مورد به سادگی ثابت ھای مجتمع را تعیف می Enum
کنند و یا دارای نام باشند که مقدمه یک نوع جدید خواھند بود .
enum بدون نام {A,B,C } enum ٠ ثابتھای , A= ١, b= ٢C =
٠ و X.A = با مقادیر x نوع جدید {enum X { A,B,C دارای نام Enum را تعریف می کند . در حالی که
٢ تعریف می کند . X.C = ١ و = X.B
یک عبارت ریاضی فراھم شده Enum ھا باید حداقل دارای یک عضو باشند . اگر برای یک عضو Enum
دارای ارزش عضو قبلی به علاوه Enum باشد ارزش عضو مذکور برابر حاصل عبارت است و عضو بعدی
یک است .
Enum { A , B = 5 + 7 , C, D = 8 , E }
٩, E = ٨, D = ١٣, C = ١٢B = , ٠ = A داریم
Enum صفات
min کوچکترین عضو
max بزرگترین عضو
size سایز نگھداری ارزش عضو
Enum مقدار دھی
دارای مقدار اولین عضو است . Enum در غیاب یک مقدار دھنده به صورت آشکار ، یک متغیر
Enum X { A = 3 , B,C }
; X x . برابر ٣ می شود X مقدار