2.7. Func?ii inline

2.7. Func?ii inline

Dac? ?ntr-un program destul de des (de exemplu, ?n ciclu) se apeleaz? func?ii mici, aceasta poate conduce la pierderi suplimentare de timp. Timpul poate fi pierdut la organizarea salturilor spre func?ii ?i  la ?ntoarcerea ?napoi. O ie?ire din asemenea situa?ie poate fi indica?ia compilatorului c? ?n loc de apelul func?iei concrete s? se insereze codul func?iei. Acest proces se nume?te dezvoltarea codului ?n interior ?i este similar cu folosirea macrocomenzilor ?n limbajul de asamblare. A?a func?ii ?n C++ se numesc func?ii inline.

Func?ia inline este func?ia care se dezvolt? ?n interior ?n locul apelului. Func?ia ?n program devine inline prin prefixarea antetului ei la definire cu cuv?ntul-cheie inline.

Cercet?m exemplul:

#include "iostream.h"
inline int XOR(int a, int b) // antetul func?iei te tipul inline
{
   return (a||b) && !(a&&b);
}
 
void main()
{
   cout << "XOR(0, 0) = " << XOR(0, 0) << endl;
   cout << "XOR(0, 1) = " << XOR(0, 1) << endl;
   cout << "XOR(2, 0) = " << XOR(2, 0) << endl;
   cout << "XOR(2, 1) = " << XOR(2, 1) << endl;
   char c; cin >> c;
}


?n acest exemplu func?ia XOR() a fost declarat? ca func?ie inline. Pentru ca acest exemplu s? fie clar p?n? la urm?, vom explica ce face func?ia XOR(). ?n limbajul C este un set de operatori cu ac?iune pe bi?i, de exemplu, & (?I pe bi?i), | (SAU pe bi?i). ?n acest set intr? ?i operatorul ~ (XOR, adic? SAU exclusiv pe bi?i). Pentru operatorii & ?i | este ?i forma logic?, respectiv && ?i ||.

Pentru operatorul ~ a?a form? nu este prev?zut?, dar ea poate fi u?or realizat? prin func?ie. Tocmai aceasta ?i face func?ia XOR(), adic? ea ?ntoarce valoarea 0 (false) c?nd ambele argumente sunt zero sau ambele sunt diferite de zero, ?i ?ntoarce valoarea 1 (true) c?nd unul din argumente este zero ?i cel?lalt este diferit de zero. Dac? lans?m programul de mai sus, ob?inem urm?torul rezultat:

XOR(0, 0) = 0
XOR(0, 1) = 1
XOR(2, 0) = 1
XOR(2, 1) = 0

?n antetul func?iei putem scrie inline int sau int inline, ordinea nu conteaz?. ?n ambele cazuri, compilatorul prime?te indica?ie ca ?n orice loc unde se apeleaz? func?ia XOR() s? fie pus codul acestei func?ii, ceea ce m?re?te viteza de execu?ie. ?ns? utilizarea op?iunii inline conduce la m?rirea codului surs?, mai ales dac? func?iile inline sunt relativ mari ?i se apeleaz? ?n mai multe locuri.

Trebuie de subliniat faptul c? indica?ia de a executa func?ia inline nu este obligatorie pentru compilator, ea numai exprim? dorin?a programatorului. Dac? compilatorul concret poate s? dezvolte ?n memorie func?ia dat?, ea va fi dezvoltat? ca func?ie inline, dac? nu – atunci func?ia va fi apelat? ca o func?ie obi?nuit?. De obicei, nu pot fi expandate ca func?ii inline func?iile ce con?in m?car una din instruc?iunile for, while, do-while, switch. Dac? un compilator nu poate dezvolta o func?ie ?n memorie, el afi?eaz? un mesaj de avertizare, ceva de tipul: ”Functions containing for are not expanded inline”, ?i ignor? op?iunea inline. Deci, totul depinde de compilatorul concret.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов