مقایسه سرعت Struct و Class - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مقایسه سرعت Struct و Class

+1 امتیاز
سلام.

سرعت اجرای ساختار بیشتر است یا class و علت تفاوت سرعت بین این دو چیست?

ممنون میشم راهنمایی کنید.
سوال شده شهریور 4, 1394  بوسیله ی امیدوار (امتیاز 872)   21 63 76
دوباره تگ گذاری شد شهریور 8, 1394 بوسیله ی BlueBlade

2 پاسخ

+1 امتیاز
 
بهترین پاسخ
در #C  فرق اصلی که وجود داره این هستش که زمان ارسال به تابع struct کلا call by value هست بصورت پیش فرض مگر این که از ref استفاده کنید ولی class  این جور نیست و پیش فرض call by refrence

و آره struct داخل Stack ذخیره میشه و class روی هیپ در C#

تفاوت سرعت هم بستگی پیدا می کنه به نحوه استفاده اگر قراره که struct بزرگ باشه و چیزای زیادی ذخیره کنه و زیاد هم به توابع پاس داده بشه چون هر بار کپی میشه کند تر از class هست . وگرنه برای چیزای کوچیک سریع تر هست مثلا برای ذخیره یک position که داخلش x,y هست struct مناسب تره .
پاسخ داده شده شهریور 8, 1394 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد شهریور 8, 1394 بوسیله ی امیدوار
خیلی ممنون،
مثلا حجم struct چند بایت باشه خوبه؟ یا هر چی کمتر بهتر؟
کمتر بهتر در حد ۵-۶ تا متغیر اینا . و این که اگر زیاد ازش شی میسازی ولی قرار نیست به توابع زیاد پاس داده بشه struct بهتره
+2 امتیاز
عملاً تفاوت خاصی ندارن کلاس و struct کاملاً شبیه به هم هستند با این تفاوت که اگر scope را در کلاس مشخص نکنیم private فرض میشن.

چیزی که ممکنه تو سرعت اجرایی کلاس های تاثیر گذار باشه فراخوانی سازنده کلاس هستش که اگر struct POD باشه که سازنده نداره و قاعدتاً سریع تر هستش.

البته شما برای کلاس هم قادرید کخ default constructor را حذف کنید.
پاسخ داده شده شهریور 5, 1394 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
سلام.
ممنون آقای ساتکی عزیز
منظورتون از scope سطح دسترسی هستش؟ تا حایی که من میدنم زمانی که برای خارجی ترین کلاس سطح دسترسی تعیین نکنیم پیشفرض internal میگیره.
تا جایی که من میدونم ساختار در stack ذخیره میشه اما کلاس در heap آیا این فرقی نمیکنه چون دسترسی به stack سریعتر از heap هستش.؟
اگر سازنده پیشفرض رو حذف کنم  منابع کلاس از کجا تامین میشه؟

با تشکر فراوان از شما
"تا جایی که من میدونم ساختار در stack ذخیره میشه "

نه این طور نیست شما می تونید یک کلاس را توی یک تابع استفاده کنید مثلا Foo instance1; که در این صورت نمونه کلاس شما در stack قرار می گیره.

بله شما  می تونید struct رو هم new کنید که در heap قرار بگیره.

در کل سرعت دسترسی به stack بالاست و این قضیه مربوط به زمان  allocation حافظه نیست.

قرار نیست فقط توی constructor منابع را اشغال کنید می تونید به زمان دیگر در صورت نیاز این کار رو انجام بدید.
"نه این طور نیست شما می تونید یک کلاس را توی یک تابع استفاده کنید مثلا Foo instance1; که در این صورت نمونه کلاس شما در stack قرار می گیره."

یعنی بعد از new شدن منابع در heap در نظر گرفته میشه و دسترسی به شی در stack ممنون میشم بیشتر توضیح بدید.
تو این لینک https://msdn.microsoft.com/en-us/library/ah19swz4.aspx گفته struct value type هستش پس چطور تو heap قرار میگیره من الان هنگم.
https://msdn.microsoft.com/en-us/library/saxz13w4.aspx
به مثال زیر توجه کنید.
class Foo1{
int value;
};

void test(){
Foo1 a;
}
class testClass{
public:
Foo1 a;
};

 

نمونه a در تابع test در stack قرار میگیره ولی نمونه a در کلاس testClass در heap قرار می گیره.
 
مثال زیر یک struct را در heap میسازه:
struct Foo{
	int a;
};



	auto foo = new Foo;

 

 

سلام آقای ساتکی
من راجب به این سوال تحقیق کردم در سی پلاس پلاس با کلمه کلیدی new ساختار در heap قرار میگیره اما راجب سیشارپ من چیزی متوجه نشدم ؟
...