تاثیر تعریف اعضای struct در سرعت - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۸۲ نفر آنلاین
۱ عضو و ۸۱ مهمان در سایت حاضرند

تاثیر تعریف اعضای struct در سرعت

+3 امتیاز
75 بازدید

سلام من می خواتم بدونم اگر یک struct داشته باشیم مثلا 

struct A
{
   int a;
   char b;
   char* f;
}

آیا ترتیب تعریف اعضا در سرعت یا حافظه تفاوتی ایجاد می کنه ؟

سوال شده مرداد 4, 1393  بوسیله ی 13mody (امتیاز 248)   1 6 28

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

بله ایجاد میکنه .

یکی از روش های افزایش Cache Hit اینه که داده های که بیشتر استفاده میشن رو کنار هم تعریف کنید .

با توجه به ساختاری که اینجا تعریف کردید ، و اگر فرض کنیم که Cache Line اندازش 64 بایت باشه . مثلا اگه شما اول متغییر b اول بخواهید تغییر بدید ، از آدرس b تا 64 بایت به بعد میره داخل Cache . پس در این صورت وقتی که میخواید مقدار f رو تغییر بدید دیگه لازم نیست که سیستم دوباره اون رو بریزه توی Cache . چون درحال حاضر توی Cache هست .

و حالا اگه شما بخواهید a رو تغییر بدید ، چون از آدرس b تا 64 بایت به بعد داخل Cache بارگذاری شده ، و چون a داخل این آدرس نبوده ، پس باید از آدرس a به بعد دوباره داخل Cache ریخته میشه . پس بهتر بود اولین متغییری که قرار بود بارگزاری بشه ( برای خوندن/نوشتن ) متغییر a بود .

چون با این کار ۲ متغییر بعدی هم داخل Cache بارگزاری میشدن . این مثال سادش بود . برای ساختار هایی که اندازه های بزرگتری دارند باید بیشتر دقت کنی . و یه نکنه دیگه هم که خیلی مهمه اینه که متغییر هات رو همیشه Align کن .

درکل میشه گفت که داده هایی که بیشتر استفاده میشن و یا پشت سر هم استفاده میشن رو کنار هم تعریف کن . طوری که با بارگزاری اولین متغییر مورد نظر متغییر های بعدی هم توی Cache قرار بگیرن .

با رعایت کردن قوانین Cache و Align کردن های مناسب میتونید سرعت اجرای برنامه رو خیلی خیلی زیاد کنید .

پاسخ داده شده مرداد 5, 1393 بوسیله ی Ali Rahbar (امتیاز 4,805)   4 14 46
در تکمیل صحبت های بالا تغییر ترتیب تعریف اعضای داخل struct یک مزیت دیگه هم داره این که میتونه حافظه مصرفی رو هم کمتر کنه
دراین مورد لینک روبرو هم مطالب جالبی داره http://www.catb.org/esr/structure-packing/
...