PDA

View Full Version : مبادرت کامپایلر برای inline کردن توابع عضو!



deopen
سه شنبه 10 دی 1387, 22:27 عصر
اگر تابع عضوی در بدنه تعریف کلاس موجود باشد کامپایلر به فراخوانی inline تابع مبادرت میکند.


سوال هایی که مطرح میکنم در باره ی متن بالاست.

چرا inline بودن این توابع از نظر کامپایلر بهتر است؟ (تا حدودی اطلاع دارم, نیاز به توضیح با مثال هست)

چرا فقط در محدوده ی تعریف یک کلاس ؟

متشکر میشوم اگر توضیحی کامل در مورد این رفتار بدین.

Mehdi Asgari
سه شنبه 10 دی 1387, 23:02 عصر
کامپایلر نظری نداره ، این ما هستیم که میگیم این توابع inline باشن (در ضمن این یه recommendation به کامپایلر هست (مثل استفاده از register و ممکنه کامپایلر اون رو inline نکنه.)

اگه تابعی رو در داخل یک کلاس علاوه بر تعریف ، کدش رو هم بنویسیم inline محسوب میشه (و اگه فقط تعریف کنی و پیاده سازیش رو بذاری برای خارج از کلاس ، inline نمیشه ، مگر این که از کلمۀ کلیدی inline استفاده کنی)
مثال: متد های A و B و C، به صورت inline هستن ، ولی D نه


class MyClass
{
public:
void A() { cout << "I'm inline" ; }

void B();

inline void C();

void D();
};

inline void MyClass::B()
{
cout << "I'm inline too";
}

void MyClass::C()
{
cout << "I'm inline too";
}

void MyClass::D()
{
cout << "I'm not inline";
}

Saeed_m_Farid
چهارشنبه 11 دی 1387, 00:26 صبح
اگر تابع عضوی در بدنه تعریف کلاس موجود باشد کامپایلر به فراخوانی inline تابع مبادرت میکند. سلام،
اولا آقا نيما قدم رنجه فرمودين به ما هم سري زدين :چشمک:
بعدش جناب deopen : اين جمله رو اگه بگين از كجا اومده ممنون ميشم! فكر كنم طبق معمول مترجم محترم اشتباه فرمودن، من فكر ميكنم منظورشون اين بوده:

اگر پياده سازي تابع عضوی در بدنه تعریف کلاس موجود باشد کامپایلر به فراخوانی inline تابع مبادرت میکند.

ولي به نظر من اين كار اشتباهه! مخصوصا در مورد توابع بزرگ يا پرمصرف؛ چون اگه مكررا يه تابع پرمصرف و طولاني از اين نوع رو تعريف كنيد حجم فايل كامپايل شده خيلي زياد ميشه، اين نوع پياده سازي (البته از ديدگاه بنده!) موقعي مفيده كه فقط سرعت مدنظر باشه كه دراونصورت هم تفاوت خيلي جزئيه! ولي هزينه كامپايل خيلي بالا ميره و كلا سودش از ضررش كمتره و نميارزه!

با تشكر.

Mehdi Asgari
چهارشنبه 11 دی 1387, 01:07 صبح
چون اگه مكررا يه تابع پرمصرف و طولاني از اين نوع رو تعريف كنيد حجم فايل كامپايل شده خيلي زياد ميشه
گفتم که این فقط یک hint هست و کامپایلر می تونه اون رو نادیده بگیره.
http://yosefk.com/c++fqa/inline.html
فصل 7 کتاب C++ Primer :


Specifying inline on a function is a hint to the compiler to expand the function into code directly at the call point.
فصل 7 کتاب The C++ PL :


The i n l i n e specifier is a hint to the compiler that it should attempt to generate code for a call of
f a c () inline rather than laying down the code for the function once and then calling through the
usual function call mechanism. A clever compiler can generate the constant 7 2 0 for a call f a c (6 ).
The possibility of mutually recursive inline functions, inline functions that recurse or not depending
on input, etc., makes it impossible to guarantee that every call of an i n l i n e function is actually
inlined. The degree of cleverness of a compiler cannot be legislated, so one compiler might generate
7 2 0 , another 6 *f a c (5 ), and yet another an uninlined
call f a c (6 ).

Saeed_m_Farid
چهارشنبه 11 دی 1387, 01:57 صبح
جالب بود ممنون، نميدونستم inline كردن توابع با هوش كامپايلر رابطه داره ممنون، ولي يه سوال در مورد توابع بازگشتي و اينا اينطوري كه ممكنه كامپايلر قاط بزنه همه چي كه مثل اين فاكتوريل ساده نيست بفرض در مورد الگوريتمهاي ژنتيك يا هيريستيك مساله به اين سادگي كه نيست؛ مثلا شايد بقول فصل هفت اين كتابه "cleverness" كامپايلر با منطق من در تعارض باشه؟ همچين چيزي ممكنه؟

Mehdi Asgari
چهارشنبه 11 دی 1387, 02:46 صبح
چه ربطی به الگوریتم داره ؟ (بحث بر سر سی پلاس پلاسه ها)
متوجه سوالت نشدم.
کامپایلر هر وقت تو بگی فلان تابعو inline کن که این کارو نمی کنه. یه دلیلش "افزایش حجم کد خروجی" هست
بخش آخر فصل 4 کتاب Inside C++ Object Model :


The inline keyword (or the definition of a member function (or friend) within a class declaration) is only a request. For the request to be honored, the compiler must believe it can "reasonably" expand the function in an arbitrary expression.

When I say the compiler believes it can "reasonably" expand an inline function, I mean that at some level the execution cost of the function is by some measure less than the overhead of the function call and return mechanism. cfront determines this by a complexity measure heuristic, usually by counting the number of assignments, the number of function calls, the number of virtual function calls, and so on. Each category of expression is weighted, and the complexity of the inline function is determined as a sum of its operations. Obviously, the values assigned to the complexity measure are open to debate.
....
Are other compilers as restricted as cfront in handling inline expansion? No. However, compiler vendors en mass (that is, both on the UNIX and PC side) unfortunately seem to consider it unnecessary to discuss in any detail the extent of or constraints on their inline support. In general, you have to poke around the assembler to see what has or hasn't been inlined.


اگه خیلی علاقه به این بحث داری ، از من تازه کار بیش از این نمی تونی یاد بگیری. Peyton Jones یه مقاله داره در مورد inlining در Haskell (تو صفحه اش در MS research بگردی هست) با این که فقط در مورد زبان های تابعیه ولی خیلی دید بهت میده در این زمینه
{ توصیۀ برادر کوچیکه: یه زبان تابعی یاد بگیر. خیلی در فهم مفاهیم برنامه نویسی بهت کمک می کنه }

deopen
چهارشنبه 11 دی 1387, 13:10 عصر
اين جمله رو اگه بگين از كجا اومده ممنون ميشم! فكر كنم طبق معمول مترجم محترم اشتباه فرمودن، من فكر ميكنم منظورشون اين بوده:

اگر پياده سازي تابع عضوی در بدنه تعریف کلاس موجود باشد کامپایلر به فراخوانی inline تابع مبادرت میکند.


با ابراز تاسف باید بگم که این اشتباه از مترجم نبوده و من اشتباه کردم, شرمندم, این متن اصلی :



How to program fifth edition by Deitel
مترجم : دکتر محسن شریفی
"اگر یک تابع عضو در بدنه ی تعریف یک کلاس تعریف شده باشد , کامپایلر ++C به فراخوانی های inline تابع عضو مبادرت میکند. توابع عضو تعریف شده در خارج از یک کلاس می توانند با استفاده ی صریح از لغت کیلیدی inline به صورت inline در آیند. به خاطر داشته باشید که کامپایلر حق inline نکردن هر تابعی را برای خود محفوظ نگه می دارد"


بهتر شد که من این اشتباه را کردم , مگه چه فرقی هست؟ تعریف شده باشد یا موجود باشد یا پیاده سازی شده باشد , چون برای من فرقی نداشت و برای شما و کتابم فرق داشت , اگر امکان دارد به من فرقش را توضیح دهید .


توصیۀ برادر کوچیکه: یه زبان تابعی یاد بگیر. خیلی در فهم مفاهیم برنامه نویسی بهت کمک می کنه

زبان تابعی؟ چرا این پیشنهاد را میکنید؟ زبان سطح پایین مانند اسمبلی قدرتمند است پس کشش دارد , زبان cpp قدرتمند است, قابل توسعه است, جدید است , شی گرا است و ... , ولی در زبان تابعی مثل c کششی نیست , البته برای من , ممکن توضیح بدین چرا این توصیه را کردید؟

Mehdi Asgari
چهارشنبه 11 دی 1387, 16:39 عصر
اگر امکان دارد به من فرقش را توضیح دهید .
فرق بین تعریف و پیاده سازی توابع: اولی ترجمۀ declaration و دومی definition هست (یعنی متدهای B و C و D در مثال بالا ، فقط declaration هستن و definition اون ها بعدا اومده)
متن زیر رو از استاندارد C++ سال 1998 برداشتم: (ISOIEC14882-1998)


A declaration is a definition unless it declares a function without specifying the function's body, it contains the extern specifier or a linkage-specification and neither an initializer nor a function-body, it declares a static data member in a class declaration, it is a class name declaration,...

زبان تابعی؟ چرا این پیشنهاد را میکنید؟ زبان سطح پایین مانند اسمبلی قدرتمند است پس کشش دارد , زبان cpp قدرتمند است, قابل توسعه است, جدید است , شی گرا است و ... , ولی در زبان تابعی مثل c کششی نیست , البته برای من , ممکن توضیح بدین چرا این توصیه را کردید؟
کشش نمی دونم چیه ، تعریفت از قدرت رو هم نمی دونم چیه .
قابل توسعه ؟ شوخی می کنی.
جدید و قدیم بودن چه ربطی به بحث ما داره ؟ سی پلاس پلاس همسن بیشتر زبان های تابعیه. (از بعضی ها قدیمی تر)
OCaml و Common LISP شی گرایی رو ساپورت می کنن. (16 تا از پترن های GOF از قبل در CLOS وجود داشتن)

بحث بیشتر در این مورد آف تاپیک محسوب میشه. می تونی یه تاپیک دیگه ایجاد کنی و سوالت رو اونجا مطرح کنی

deopen
چهارشنبه 11 دی 1387, 18:22 عصر
بحث بیشتر در این مورد آف تاپیک محسوب میشه. می تونی یه تاپیک دیگه ایجاد کنی و سوالت رو اونجا مطرح کنی
بزودی اینکارو میکنم, باید اینجا به نتیجه برسم.


کشش نمی دونم چیه ، تعریفت از قدرت رو هم نمی دونم چیه .
قابل توسعه ؟ شوخی می کنی.

کوتاه بگم تا از همونی که گفتی ... چی بود ... آف تاپیک جولوگیری بشه.
خوب کشش که هیچی منظورم جاذبه بود.
قابل توسعه است, نیست؟ این که آخرین توسعه آن در سال 1983 بوده دلیل به قابل توسعه نبودنش البته از نظر من نمیشود. این مربوط به آینده است در تاپیکی جدا گانه به بحث در موردش خواهیم پرداخت. راستش از نظر من قویترین برنامه نویسی cpp است و نباید گفت از این بهتر نمی شود , از این بهتر هم می شود .

به این مثال توجه کنید :
C+=Z
این دیگه واقعا شوخی بود!

قدرت از نظر من یعنی نزدیکی به سخت افزار و زبان برنامه نویسی قدرتمند میباشد که قادر باشد دست برنامه نویس را به هر جا که قصدش را دارد از نزدیکترین راه برساند. با اینکه من هیچ وقت قادر نبودم دستم را به به راحتی هاردم برسانم البته قبل از توسعه کیسم!

بریم سر اصل موضوع!

ازتون ممنونم بابت توضیحاتتون در باره ی تعریف و پیاده سازی, متوجه شدم اما ... امم... من همیشه از این کار دوری میکنم و تعریف و پیاده سازی را دو گزینه جدا قلمداد میکنم. این کار کمی عجیب به نظر می آید و من به فکر بی استفاده بودن توابع inline افتادم , این کار از قوانین OOP دور است! و بیشتر به برنامه نویسیه تابعی شباهت دارد . اگر امکان دارد مفید بودن توابع inline رو برام توضیح بدید. متشکرم.

Mehdi Asgari
چهارشنبه 11 دی 1387, 19:38 عصر
این کار کمی عجیب به نظر می آید و من به فکر بی استفاده بودن توابع inline افتادم , این کار از قوانین OOP دور است! و بیشتر به برنامه نویسیه تابعی شباهت دارد . اگر امکان دارد مفید بودن توابع inline رو برام توضیح بدید.
1- کجای inline کردن توابع به FP شباهت داره ؟
2- کی گفته OOP تنها راه درست برنامه نویسی و ایجاد سیستم های نرم افزاریه ؟ (به غیر از کتابای مزخرف درسی دانشگاهی). سی پلاس پلاس یه زبان multi paradigm هست نه یک زبان OOP
3- گاهی اوقات inline کردن یک تابع می تونه باعث افزایش پرفورمنس کد بشه ، مثلا توابعی که یکی دوبار قراره فراخوانی بشن ، یا توابعی که یکی دو خط بیشتر نیستن. (چون فراخوانی توابع هزینه داره.) (و این افزایش پروفورمنس هم طوری نیست که محسوس باشه)

در مورد FP جواب هات رو دارم ، منتها در یک تاپیک جداگانه اگه خواستی بحث می کنیم.
فقط لطفا طوری بحث رو مطرح نکن که از بحث علمی دور شیم (مثلا این که کدوم زبان بهتر یا قدرتمند تره؛ که باعث شی هر کی بیاد اینجا و از زبانی که بلده طرفداری کنه)
به اینم توجه کن که مزایای FP چیزی از OOP کم نمی کنن و بالعکس

deopen
چهارشنبه 11 دی 1387, 22:34 عصر
واقعا ازتون ممنونم. کاملا متقاید شدم , بله حتما تاپیکی با عنوان مناسب مطرح میکنم تا از اطلاعاتتون بهره ببرم, چون واقعا بحث برام جالب شده و صد در صد جوابم را در تاپیک خواهم گرفت .