PDA

View Full Version : نوع داده



iut.ali
سه شنبه 27 اسفند 1392, 12:18 عصر
با سلام دو تا سوال دارم که ممنون میشم جوابمو بدید
یکی اینکه نوع داده ی mutable به چه دردی میخوره و یکی دیگه اینکه inline methods چی هستند و به جه کاری میاند

rahnema1
سه شنبه 27 اسفند 1392, 19:04 عصر
کلمه mutable موقعی به کار میره که شما از یک کلاس یک شیء ثابت درست می کنید
فرض کنید این کلاس یک سری داده در خودش داشته باشه که بخواهید آنها را تغییر بدهید ، به علت اینکه این شیء به صورت ثابت هست امکان تغییر داده موجود در آن وجود نداره مگر اینکه در داخل کلاس اون داده به صورت mutable اعلان شده باشه
مثلا در مثال زیر با اینکه var2 ثابت هست میشه عضو x آن را تغییر داد چون x به صورت mutable هست اما عضو y را نمیشه تغییر داد

struct A
{
A()
{
x=4;
y=5;
}
mutable int x;
int y;
};

int main()
{
const A var2;
var2.x = 345;
}


تابع های inline روشی برای بهینه سازی برنامه هست. مثلا اگر تابع inline باشه و چند بار در برنامه صدا زده بشه کامپایلر میاد
inline member function
وقتی یک تابع را به صورت inline اعلان می کنیم شما به کامپایلر پیشنهاد می دهید که عمل صدا زدن تابع را سریعتر کنه. یک روش برای این کار اینه که کد تابع را هر جا که صدا زده بشه قرار میده. این کار باعث اجرا سریعتر برنامه میشه یا مثلا بعضی از آرگومان های تابع ثابت باشند در هنگام کامپایل موجب میشه با جایگزینی و محاسبه بعضی مقادیر در هنگام کامپایل دیگه لازم نباشه بعضی از کدها اجرا بشن
http://gcc.gnu.org/onlinedocs/gcc/Inline.html

همون طور که اشاره شد گذاشتن کلمه inline هنگام اعلان تابع لزوما موجب inline شدن اون نمیشه بلکه پیشنهادیه به کامپایلر که این کار را انجام بده
یک نکته دیگه اینکه این کار همیشه ممکنه جواب نده مثلا اگه یک تابع بازگشتی به صورت inline اعلان بشه چون چندین بار خودش را صدا می زنه موجب میشه که کد مورد نظر چندین بار در خودش تکرار بشه و یا در مورادی که تابع ما خیلی بزرگ باشه. بنابراین توصیه شده بیشتر در خصوص تابع های کوچک مورد استفاده قرار بگیره
در خصوص inline member function یا به قول شما inline method باز هم همین قضیه صدق می کنه
شما می تونید در یک کلاس یک تابع را اعلان کنید که به صورت inline باشه
-تابع هایی که در خود کلاس اعلان و تعریف می شوند inline هستند
-تابع هایی که در کلاس اعلان شده و در خارج از آن تعریف می شوند با استفاده از کلمه inline می تونند inline بشن

struct A
{
int f(int a){return a*a;}
int x;
int y;
};
// morede dovom
struct A
{
int f(int a);
int x;
int y;
};

inline int A::f(int a){return a*a;}