C++ proporciona funcions en línia per reduir la sobrecàrrega de la trucada de funció. Una funció en línia és una funció que s'expandeix en línia quan es crida. Quan s'anomena la funció en línia, el codi sencer de la funció en línia s'insereix o se substitueix al punt de la crida a la funció en línia. Aquesta substitució la realitza el compilador C++ en temps de compilació. Una funció en línia pot augmentar l'eficiència si és petita.
Sintaxi:
inline return-type function-name(parameters) { // function code }>
Recordeu que l'inserció és només una sol·licitud al compilador, no una ordre. El compilador pot ignorar la sol·licitud d'inserció.
El compilador no pot realitzar inline en circumstàncies com:
- Si una funció conté un bucle. ( per, mentre i fer-mentre )
- Si una funció conté variables estàtiques.
- Si una funció és recursiva.
- Si un tipus de retorn de funció no és nul, i la instrucció de retorn no existeix al cos de la funció.
- Si una funció conté una instrucció switch o goto.
Per què s'utilitzen les funcions en línia?
Quan el programa executa la instrucció de trucada de funció, la CPU emmagatzema l'adreça de memòria de la instrucció després de la crida de funció, copia els arguments de la funció a la pila i finalment transfereix el control a la funció especificada. Aleshores, la CPU executa el codi de funció, emmagatzema el valor de retorn de la funció en una ubicació/registre de memòria predefinit i retorna el control a la funció de trucada. Això es pot convertir en una sobrecàrrega si el temps d'execució de la funció és inferior al temps de commutació de la funció de trucada a la funció cridada (called).
Per a funcions que són grans i/o realitzen tasques complexes, la sobrecàrrega de la trucada de funció sol ser insignificant en comparació amb la quantitat de temps que la funció triga a executar-se. Tanmateix, per a les funcions petites i d'ús habitual, el temps necessari per fer la crida de funció sovint és molt més que el temps necessari per executar el codi de la funció. Aquesta sobrecàrrega es produeix per a funcions petites perquè el temps d'execució d'una funció petita és menor que el temps de commutació.
Funcions en línia Avantatges:
- La sobrecàrrega de la trucada de funció no es produeix.
- També desa la sobrecàrrega de les variables push/pop a la pila quan es crida una funció.
- També desa la sobrecàrrega d'una trucada de retorn d'una funció.
- Quan introduïu una funció, podeu habilitar el compilador perquè realitzi una optimització específica del context al cos de la funció. Aquestes optimitzacions no són possibles per a les trucades de funcions normals. Es poden obtenir altres optimitzacions considerant els fluxos del context cridant i del context cridat.
- Una funció en línia pot ser útil (si és petita) per als sistemes incrustats perquè en línia pot produir menys codi que la funció anomenada preàmbul i retorn.
Desavantatges de la funció en línia:
- Les variables afegides de la funció en línia consumeixen registres addicionals, després de la funció en línia, si augmenta el nombre de variables que utilitzarà el registre, poden generar una sobrecàrrega en la utilització dels recursos variables del registre. Això vol dir que quan el cos de la funció en línia es substitueix en el punt de la crida de la funció, també s'insereix el nombre total de variables utilitzades per la funció. Així, el nombre de registres que s'utilitzaran per a les variables també augmentarà. Per tant, si els nombres de variables inlineing després de la funció augmenten dràsticament, segurament causaria una sobrecàrrega en la utilització del registre.
- Si utilitzeu massa funcions en línia, la mida del fitxer executable binari serà gran, a causa de la duplicació del mateix codi.
- Massa inline també pot reduir la taxa d'èxit de la memòria cau d'instruccions, reduint així la velocitat d'obtenció d'instruccions de la memòria cau a la de la memòria primària.
- La funció en línia pot augmentar la sobrecàrrega del temps de compilació si algú canvia el codi dins de la funció en línia, llavors tota la ubicació de la trucada s'ha de recompilar perquè el compilador hauria de reemplaçar tot el codi una vegada més per reflectir els canvis, en cas contrari continuarà amb l'antic. funcionalitat.
- Les funcions en línia poden no ser útils per a molts sistemes integrats. Perquè en els sistemes integrats la mida del codi és més important que la velocitat.
- Les funcions en línia poden provocar una derrota perquè l'inserció en línia pot augmentar la mida del fitxer executable binari. La batuda a la memòria fa que el rendiment de l'ordinador es degradi. El programa següent mostra l'ús de la funció en línia.
Exemple:
C++
#include> using> namespace> std;> inline> int> cube(>int> s) {>return> s * s * s; }> int> main()> {> >cout <<>'The cube of 3 is: '> << cube(3) <<>'
'>;> >return> 0;> }> |
>
>Sortida
The cube of 3 is: 27>
Funció i classes en línia
També és possible definir la funció en línia dins de la classe. De fet, totes les funcions definides dins de la classe estan implícitament en línia. Així, totes les restriccions de les funcions en línia també s'apliquen aquí. Si necessiteu declarar explícitament una funció en línia a la classe, només heu de declarar la funció dins de la classe i definir-la fora de la classe mitjançant la paraula clau en línia.
Sintaxi:
class S { public: inline int square(int s) // redundant use of inline { // this function is automatically inline // function body } };> L'estil anterior es considera un mal estil de programació. El millor estil de programació és escriure el prototip de la funció dins de la classe i especificar-lo com una línia a la definició de la funció.
Per exemple:
class S { public: int square(int s); // declare the function }; inline int S::square(int s) // use inline prefix { }> Exemple:
C++
// C++ Program to demonstrate inline functions and classes> #include> using> namespace> std;> class> operation {> >int> a, b, add, sub, mul;> >float> div>;> public>:> >void> get();> >void> sum();> >void> difference();> >void> product();> >void> division();> };> inline> void> operation ::get()> {> >cout <<>'Enter first value:'>;> >cin>> a;> >cout <<>'Enter second value:'>;> >cin>> b;> }> inline> void> operation ::sum()> {> >add = a + b;> >cout <<>'Addition of two numbers: '> << a + b <<>'
'>;> }> inline> void> operation ::difference()> {> >sub = a - b;> >cout <<>'Difference of two numbers: '> << a - b <<>'
'>;> }> inline> void> operation ::product()> {> >mul = a * b;> >cout <<>'Product of two numbers: '> << a * b <<>'
'>;> }> inline> void> operation ::division()> {> >div> = a / b;> >cout <<>'Division of two numbers: '> << a / b <<>'
'>;> }> int> main()> {> >cout <<>'Program using inline function
'>;> >operation s;> >s.get();> >s.sum();> >s.difference();> >s.product();> >s.division();> >return> 0;> }> |
>
format de cadena java llarg
>
Sortida:
Enter first value: 45 Enter second value: 15 Addition of two numbers: 60 Difference of two numbers: 30 Product of two numbers: 675 Division of two numbers: 3>
Què passa amb la macro?
Els lectors familiaritzats amb el llenguatge C saben que el llenguatge C utilitza macro. El preprocessador substitueix totes les trucades de macro directament dins del codi de macro. Es recomana utilitzar sempre la funció en línia en lloc de la macro. Segons el Dr. Bjarne Stroustrup, el creador de macros C++ gairebé mai no són necessàries en C++ i són propensos a errors. Hi ha alguns problemes amb l'ús de macros en C++. La macro no pot accedir als membres privats de la classe. Les macros semblen trucades de funció, però en realitat no ho són.
Exemple:
C++
// C++ Program to demonstrate working of macro> #include> using> namespace> std;> class> S {> >int> m;> public>:> >// error> #define MAC(S::m)> };> |
>
>
Sortida:
Error: '::' may not appear in macro parameter list #define MAC(S::m)>
El compilador C++ comprova els tipus d'argument de les funcions en línia i les conversions necessàries es realitzen correctament. La macro del preprocessador no és capaç de fer-ho. Una altra cosa és que les macros són gestionades pel preprocessador i les funcions en línia són gestionades pel compilador C++. Recordeu: és cert que totes les funcions definides dins de la classe estan implícitament en línia i el compilador C++ realitzarà crides en línia d'aquestes funcions, però el compilador C++ no pot fer-ho en línia si la funció és virtual. El motiu pel qual es crida a una funció virtual es resol en temps d'execució en lloc de compilació. Virtual significa esperar fins al temps d'execució i els mitjans en línia durant la compilació, si el compilador no sap quina funció s'anomenarà, com pot realitzar l'inserció? Una altra cosa a recordar és que només és útil fer la funció en línia si el temps dedicat durant una trucada de funció es compara més amb el temps d'execució del cos de la funció.
Un exemple on la funció en línia no té cap efecte:
inline void show() { cout << 'value of S = ' << S << endl; }> La funció anterior triga relativament molt a executar-se. En general, una funció que realitza una operació d'entrada-sortida (I/O) no s'ha de definir com a en línia perquè passa una quantitat considerable de temps. La incorporació tècnica de la funció show() té un valor limitat perquè la quantitat de temps que trigarà la instrucció d'E/S supera amb escreix la sobrecàrrega d'una trucada de funció. Depenent del compilador que utilitzeu, el compilador pot mostrar-vos un avís si la funció no s'amplia en línia.
Els llenguatges de programació com Java i C# no admeten funcions en línia. Però a Java, el compilador pot realitzar l'inserció en línia quan es crida al mètode final petit perquè les subclasses no poden substituir els mètodes finals i la crida a un mètode final es resol en temps de compilació.
En C#, el compilador JIT també pot optimitzar el codi introduint petites trucades de funció (com substituir el cos d'una funció petita quan es crida en un bucle). L'últim que cal tenir en compte és que les funcions en línia són una característica valuosa de C++. L'ús adequat de les funcions en línia pot millorar el rendiment, però si les funcions en línia s'utilitzen de manera arbitrària, no poden oferir millors resultats. En altres paraules, no espereu un millor rendiment del programa. No feu totes les funcions en línia. És millor mantenir les funcions en línia tan petites com sigui possible.