reinterpret_cast چیست ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

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


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

reinterpret_cast چیست ؟

+3 امتیاز
سلام

این کست دقیقا چکار میکنه ؟

ممنون
سوال شده شهریور 4, 1393  بوسیله ی Azar (امتیاز 628)   29 42 61
دوباره تگ گذاری شد شهریور 11, 1393 بوسیله ی BlueBlade
این تبدیل فقط به کامپایلر می‌گوید اشاره گری را از نوع دیگری به حساب بیاورد بدون هیچ توجه به نوع.
این جا مقایسه کرده: http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used
توضیحات دقیق تر: http://en.cppreference.com/w/cpp/language/reinterpret_cast

1 پاسخ

+4 امتیاز

در مورد Cast های دیگه اینجا توضیح داده شده : http://www.7khatcode.com/75/regular-cast-vs-static_cast-vs-dynamic_cast

reinterpret_cast بی قانون ترین Cast توی ++C هست که اصلا توجهی به آرایش داده مقصد و مبدا نداره . و فقط مقدار رو از یک نوع به نوع دیگه تبدیل میکنه .

برای مثال یک متغییر float از لحاظ چیدمان باینری با یک متغییر int تفاوت داره .

اگر شما از static_cast یا c-style cast برای کست کردن یک float به int استفاده کنید ، داده های نهایی که به int مقصد منتقل میشه تغییر خواهد کرد ، چون اگر داخل متغییر  float شما عدد ۳ رو داشتید بتونید داخل int هم ۳ رو داشته باشید . (چون آرایش بیتی شون فرق داره )

ولی reinterpret_cast هیچ دخالتی توی هیچ کاری نداره و فقط داده ها رو انتقال میده .

پاسخ داده شده شهریور 4, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
ویرایش شده شهریور 4, 1393 بوسیله ی Ali Rahbar
برای اشاره گر ها استفاده از این نوع cast  اشکالی نداره درسته ؟
چرا داره . مثلا برای تبدیل به کلاس کلاس های فرزند و پدر به یک دیگه ، Cast هایی مثل C-Style Cast و static_cast و dynamic_cast برای شما offset اشاره گر جدید رو تنظیم میکنن . ولی reinterpret_cast این کار رو نمیکنه .
کجاها از اینجور کست استفاده میشه ؟
هرجایی که میخواهید مقدار مبدا از دقیقا همونطور که هست به مقصد منتقل کنید و نمیخواهید که cast های دیگه مقدار رو تغییر بدند یا به شما خطا نشون بدهند .
مثلا توی تبدیل یک Literal به اشاره گر .
یا تبدیل کلاس ها به هم دیگه یا تبدیل یک اشاره گر تابع به دیگری که ۲ تابع کاملا با هم تفاوت دارند.
هر تبدیلی که میخواهید بدون مراقبت کامپایلر انجام بشه . البته c-style cast خیلی از کارهای reinterpret_cast رو انجام میده ولی نه توی همه ی موارد . و توی استفاده از reinterpret_cast باید مراقب باشید و از نتیجه آگاه باشید .
خلاصه اش شاید بشه گفت تبدیل هرچیزی به هرچیزی !
منظور از تبدیل جریان داده های خام به اطلاعات واقعی چیه در این جا ؟
و کلا چی میگه ؟
It's used primarily for particularly weird conversions and bit manipulations, like turning a raw data stream into actual data, or storing data in the low bits of an aligned pointer.
گفته که : "دراصل برای تبدیل های عجیب بخصوص و دستکاری بیتی استفاده میشه ، مثل تبدیل کردن یک داده خام به یک داده واقعی . یا ذخیره کردن داده در بیت های پایینی یک اشاره گر تراز شده ."

داده خام همون داده ای هست که هیچ معنی خاصی نداره .
مثلا عدد 244 رو ما یک داده خام در نظر بگیریم .
حالا این عدد 244 رو میشه از چند دید بهش نگاه کرد .
این داده داخل متغییر char یه عدد منفی حساب میشه .
داخل متغییر float یک مفهمون دیگه .
داخل یک کلاس وکتور یه مفهوم دیگه
و داخل هر چیزی یک مفهوم رو میتونه بده .
هر کلاسی ، هر اشاره گری ، هر دستور ماشین و کلا هرچیزی که هست یه داده خام هست .
فقط تو جاهای مختلف معنی مختلف میده .
ذخیره کردن داده در بیت های پایینی یک اشاره گر تراز شده
واین یعنی چی ؟
در اشاره گرهای Align شده بیت های آخری همیشه صفر هست . هرچقدر Align بالاتر باشه بیت های بیشتری 0 میشه . اشاره گرها به Page ها اشاره میکنن و بعد قسمت پایینیشون به Offset اون Page اشاره میکنه . منظورش اینه که ( البته فکر میکنم که اینطور باشه ) میشه Offset اشاره گر ها رو تغییر داد .

خیلی متن جالبی نیست در کل .
...