PDA

View Full Version : سوال: نحوه کار sizeof و typeid



H_G_G_I
یک شنبه 12 آذر 1391, 21:12 عصر
سلام : لبخند ساده :
من دو تا سوال خوشگل داشتم اول اینکه وقتی مثلا می نویسیم sizeof(int) کامپایلر میاد مقدار اون رو موقع کمپایل ست می کنه (یعنی جای اون بزاره 4 ) یا اینکه sizeof زمان اجرا کار می کنه و هر دفعه اندازه رو حساب می کنه . : تو فکر رفتن :
-
یه سوال هم درمورد typeid دارم . : کنجکاوی :
من لازم دارم که هر دفعه نوع تک تک عناصر یه اریه طولانی رو با یه نوع دیگه مقایسه کنم .

const type_info& l_type = typeid(MyClass);
int n = 0;
for(int i = 0; i < l_arraySize; i++ )
{
if(typeid(l_array[i]) == l_type )
n++;
}


حالا می خواستم بدونم که عملگر مقایسه type_info چه طور کار می کنه ! : کنجکاوی :
یعنی نامش رو مقایسه می کنه یا ..... : کنجکاوی زیاد :
درکل سرعتش برام مهمه . :تاکید مجدد:

و بعد هم اینکه اگه تو تنظیمات پروژه (VS2010)
در قسمت C/C++ // languge // Enable RunTimeTypeInformation رو No بزارم باید typeid
کار نکنه دبگه پس چرا کار می کنه ! :کمی متفکر:
run time type info دقیقا به چیا مربوط می شه ؟

: تشکر :

#target
یک شنبه 12 آذر 1391, 21:45 عصر
در مورد سوال اول بله در زمان کامپایل مشخص میکنه

سوال دوم هم بنده ++C بلد نیستم

omidshaman
یک شنبه 12 آذر 1391, 22:39 عصر
حالا می خواستم بدونم که عملگر مقایسه type_info چه طور کار می کنه
عملگر مقایسه type_info چیه؟
type_info کاری نمی کنه این جا فقط خط اول میگه l_type یک اشاره گر ه ثابته از نوعه کلاس type_info
اگر منظورت اینه که typeid چکار می کنه؟ این جا کامل توضیح داده
http://www.cplusplus.com/reference/typeinfo/type_info/
اگر می خوای بدونی کلا کلاس type_info کدش چیه و چجوری کار می کنه اون رو دیگه من نمیدونم اگر کسی می دونه بگه منم یاد بگیرم!

H_G_G_I
یک شنبه 12 آذر 1391, 22:49 عصر
خب وقتی از typeid استفاده می کنی یه const type_info& بر می گرونه .
این کلاس چند تا تابع داره بعلاوه ی اپراتور == . خب عمل گر هم مثل همون تابع می مونه دیگه !

const type_info& l_typ1 = typeid(myClass1);
const type_info& l_typ2 = typeid(myClass2);
if(l_typ1 == l_typ2)
{
//....
}

من می خوام ببینم چطور کار می کنه !
یعنی مثلا دوتا int مقایسه می کنه یا نام این دو تا رو می گیره مقایسه می کنه یا ...

if(strcmp(l_typ1.name(), l_typ2.name()))
{
//...
}

omidshaman
یک شنبه 12 آذر 1391, 23:18 عصر
خب وقتی از typeid استفاده می کنی یه const type_info& بر می گرونه .
یک type_info برمی گردونه اون const یعنی l_type ثابت بمونه

این کلاس چند تا تابع داره بعلاوه ی اپراتور == . خب عمل گر هم مثل همون تابع می مونه دیگه !
نه دیگه معنی نمی ده کلاس اپراتور == داشته باشه!! اپراتور مثل تابع می مونه؟ مثل اینه که بگی جمع مثل ریاضی می مونه!

یعنی مثلا دوتا int مقایسه می کنه یا نام این دو تا رو می گیره مقایسه می کنه یا ...
نوع 2 تا رو مقایسه می کنه کاری به این که چی هستن نداره مثلا اینو در نظر بگیر

int a;
int i=10;
int *p=&a;
cout<<(typeid(*p)==typeid(i));
این جوابش میشه true یعنی 1 چاپ می کنه چون هر 2 تا از نوع int هستن با این که مقدارشون فرق می کنه
حالا اگر بیای .name بزاری بعد strcmp استفاده کنی باز هم همین میشه

H_G_G_I
دوشنبه 13 آذر 1391, 09:28 صبح
نه دیگه معنی نمی ده کلاس اپراتور == داشته باشه!! اپراتور مثل تابع می مونه؟ مثل اینه که بگی جمع مثل ریاضی می مونه!

شما به اینا چی می گی + , - == , = , --, ++ :عصبانی++:
اینا رو می شه برای یه کلاس پیاده سازی کرد دیگه !
مثلا برای چسبوندن دو تا رشته با هم می تونیم یه تابع بنویسم هم با == این کارو کنیم !
در هر صورت جفتشون یه کار انجام می دن .
اینم یه کلاس ساده رشته با = و == .:عصبانی++:

class Str
{
public:
char* str;

void set(const char* _cstr);
bool compare(const Str* _str);

Str& operator = (const char* _cstr);
bool operator == (const Str& _str);
};

void Str::set( const char* _cstr )
{
size_t l_len = strlen(_cstr);
str = new char[l_len+1];
strcpy(str, _cstr);
str[l_len] = '\0';
}

bool Str::compare( const Str* _str )
{
return strcmp(_str->str, str) == 0;
}

Str& Str::operator=( const char* _cstr )
{
set(_cstr);
return *this;
}

bool Str::operator==( const Str& _str )
{
return compare(&_str);
}

int main(int argc, char* argv[])
{
Str l_s1,l_s2;
l_s1 = "asdasd";
l_s2 = "asdasd";
if (l_s1 == l_s2)
std::cout << "HHHHHHEEEEEEEEEEE";

system("PAUSE");
}





نوع 2 تا رو مقایسه می کنه کاری به این که چی هستن نداره مثلا اینو در نظر بگیر

میدونم مقایسه می کنه ولی می گم چطور ! (کاش کد هاش بود :گریه:)
من خودم یه راهکار دیگه برا برنامم دارم که دیگه لازم نیست از typeid استفاده کنم ! ولی یکم درد سر داره !
حالا می خواستم بدونم برای این مقایسه چه کدی نوشتن !
تا اگه مناسب نبود اون راهکار خودمو در نظر بگیرم !

H_G_G_I
دوشنبه 13 آذر 1391, 09:46 صبح
یافتم ! :لبخند:
http://devmaster.net/forums/topic/5988-performance-of-typeid-comparison
-
به طور خلاصه typeid برای نوع هایی غیر چند ریختی زمان کامپایل ست می شه !
و برای چند ریختی ها زمان اجرا حساب می کنه !
-


type_info::operator==():

درواقع همون نام رو مقایسه می کنه !

#target
دوشنبه 13 آذر 1391, 10:30 صبح
گویا تمام این رشته ها بصورت استاتیک داخل فایل قرار داره و در حین اجرا با توجه به نوع (توسط یک تابع Runtime) اشاره گری به اون رشته رو داخل مثلا name قرار میده