PDA

View Full Version : Class VS Struct VS Array



H_G_G_I
دوشنبه 29 آبان 1391, 20:30 عصر
سلام .
من یه چیزی خیلی مشتاق شدم بدونم !
می شه بگید که کدوم فضای کمتری می گیره و کدوم سریع تره !

typedef float TVec3[3];
//---------------------------
struct SVec3 { float x, y, z; };
//---------------------------
class CVec3 { float x, y, z; };

اگه من بیام به صورت ارایه تعریف کنم خب پشت سر همه و ادرس حافظه فقط خونه اول داره دیگه !
پس 64 بیت صرفه جویی میشه ؟
وقتی می نویسم var[2] ادرس متغییر + ، 2 ضربدر اندازه نوع داده ایش میشه دبگه !
پس این جمع و ضرب سرعت میگیره ؟
ولی وقتی تو کلاس یا ساختار می نویسم var.z اون دیگه ضرب و جمع نمی کنه ؟
-
یه چیز دیگم اینکه مثلا وقتی ما کلاسمون تابع داره !
بعد از این کلاس چند تا نمونه بسازیم !
هر کدوم از توابع یه ادرس حافظه دارن ؟ یعنی هر کدوم باید 4 بایت می گیرن ؟
-
یا اینکه کلا" کلاس و ساختار مثل یه قالب هستن !
مثلا یه قسمت از حافظه رو بدیم !4 باید اول میشه x, بعد y , z ?
ببخشید سوال نا مفهمومه !
یکم توضیح بدین ممنون می شم !
:بامزه::قلب:

مسعود اقدسی فام
دوشنبه 29 آبان 1391, 20:35 عصر
تا جایی که یادم می‌یاد برای توابع همون جایی که کلاس تعریف شده و تابع داخلش تعریف شده حافظه اختصاص داده شده و تموم شده. لازم نیست هر شی که درست می‌شه همون کد تابع دوباره داخل شی تکرار بشه. یعنی توابع با ساختن شی کپی و حافظه نمی‌گیرن. این متعیرها هستن که چون مقدار قرار بگیرن نیاز به حافظه‌های مجزا دارن.

باز نظر دوستان رو بشنویم.

omidshaman
دوشنبه 29 آبان 1391, 22:08 عصر
این سوالا رو این جا به جواب نمیرسی بهتره تو فروم های انگلیسی مطرح کنی هر چند که اون جا هم احتمالا به جواب نمیرسی!:لبخند:
مگه شما می خواین چه برنامه ای بنویسین که 1 ضرب و تقسیم بیشتر هم براتون مهمه!

H_G_G_I
دوشنبه 29 آبان 1391, 22:42 عصر
لطف داری من بیشتر با بازی سر وکله می زنم !
مثلا فرض کن 2000 تا ابجکت تو بازی هست خوب هر کدومشون سه تا Vec3 دارن . زیاد میشه دیگه :لبخندساده:
شایدم وسواسی شدم !:قهقهه:
-
الان خودم میرم امتحان کنم ببینم چی می شه !:گیج:

Ananas
سه شنبه 30 آبان 1391, 00:49 صبح
سلام.

اگه من بیام به صورت ارایه تعریف کنم خب پشت سر همه و ادرس حافظه فقط خونه اول داره دیگه !
پس 64 بیت صرفه جویی میشه ؟نه خیر آرایه ای 3 تایی از نوع float حداقل به اندازه ی 3 * 32 بیت حافظه رو اشغال میکنه و فقط آدرس ابتدا داخل متغیر شما (برای دسترسی به حافظه) ذخیره میشه. یعنی یک اشاره گر درسته که حجم کمی داره ولی باید دید حافظه ای که گرفته چقدره. ممکنه حجم زیادی حافظه گرفته باشید که فقط با یک اشاره گر به اون دسترسی دارید پس حافظه اشغال میشه. که تو struct و class هم همین حجم حافظه داره گرفته میشه (در مثال شما) البته به Align هم دقت کنید. برای استفاده از کمترین فضا در تعریف struct و class از عبارت Pragma pack(push, 1) می تونید استفاده کنید.

وقتی می نویسم var[2] ادرس متغییر + ، 2 ضربدر اندازه نوع داده ایش میشه دبگه !اگه بگید کامپایلر کد رو تبدیل به اسمبلی کنه فکر میکنم بشه مقایسه کرد.

س این جمع و ضرب سرعت میگیره ؟آره خوب بالاخره یه زمانی خیلی کمی می بره. بستگی داره که کدتون چی باشه ممکنه با استفاده از روش های دیگه به سرعت بیشتری برسید و به نظرم بستگی به کاری که می خواید انجام بدید داره نمیشه گفت در همه موارد این روش سریع تر عمل میکنه.

ولی وقتی تو کلاس یا ساختار می نویسم var.z اون دیگه ضرب و جمع نمی کنه ؟باید این دو رو تو حالت اسمبلی مقایسه کنید.

یه چیز دیگم اینکه مثلا وقتی ما کلاسمون تابع داره !
بعد از این کلاس چند تا نمونه بسازیم !
هر کدوم از توابع یه ادرس حافظه دارن ؟ یعنی هر کدوم باید 4 بایت می گیرن ؟
-
همون طور که آقای اقدسی عزیز فرمودن برای هر نمونه توابع دوباره حافظه نمیگیرن.


یا اینکه کلا" کلاس و ساختار مثل یه قالب هستن !
مثلا یه قسمت از حافظه رو بدیم !4 باید اول میشه x, بعد y , z ?
اگه به align دقت کنید میشه. در کل اگه من باشم بردار سه بعدی رو به شکل ساختاری مشابه نمونه زیر تعریف میکنم :

#pragma pack(push, 4)
typedef struct TVec3D
{
public:
TVec3D() {};
TVec3D(float x_, float y_, float z_) { x = x_; y = y_; z = z_;};
union
{
struct
{
float x, y, z;
};
float f[3];
};
} *PVec3D;
#pragma pack(pop)