Attention! Your ePaper is waiting for publication!
By publishing your document, the content will be optimally indexed by Google via AI and sorted into the right category for over 500 million ePaper readers on YUMPU.
This will ensure high visibility and many readers!
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 264 — #302 ✐ Capítulo 9. Funciones inline //: C09:Stack4Test.cpp //{T} Stack4Test.cpp #include "Stack4.h" #include "../require.h" #include #include #include using namespace std; int main(int argc, char* argv[]) { requireArgs(argc, 1); // File name is argum<strong>en</strong>t ifstream in(argv[1]); assure(in, argv[1]); Stack textlines; string line; // Read file and store lines in the stack: while(getline(in, line)) textlines.push(new string(line)); // Pop the lines from the stack and print them: string* s; while((s = (string*)textlines.pop()) != 0) { cout
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 265 — #303 ✐ 9.4. Funciones inline y el compilador Si toda la información del tipo de la función <strong>en</strong>caja <strong>en</strong> el contexto de la llamada, <strong>en</strong>tonces la llamada a la función se sustituye directam<strong>en</strong>te por el código inline, eliminando la sobrecarga y permiti<strong>en</strong>do que el compilador pueda hacer más optimizaciones. Además, si el inline es un método, la dirección del objeto(this) se pone <strong>en</strong> el lugar apropiado, que es, por supuesto, otra acción que el preprocesador es incapaz de hacer. 9.4.1. Limitaciones Hay dos situaciones <strong>en</strong> que el compilador no puede efectuar la sustitución de inline. En estos casos, simplem<strong>en</strong>te convierte la función a la forma ordinaria tomando la definición y pidi<strong>en</strong>do espacio para la función como hace con una función no-inline. Si debe hacerlo <strong>en</strong> varias unidades de traducción (lo que normalm<strong>en</strong>te causaría un error de definición múltiple), informa al <strong>en</strong>lazador que ignore esas definiciones múltiples. En compilador no puede efectuar la sustitución de inline si la función es demasiado complicada. Esto dep<strong>en</strong>de de cada compilador particular, pero aunque muchos compiladores lo hagan, no habrá ninguna mejora de efici<strong>en</strong>cia. En g<strong>en</strong>eral, se considera que cualquier tipo de bucle es demasiado complicado para expandir como una inline, y si lo pi<strong>en</strong>sa, el bucle implica mucho más tiempo que el que conlleva la sobrecarga de la invocación de la función. Si la función es simplem<strong>en</strong>te una colección se s<strong>en</strong>t<strong>en</strong>cias simples, probablem<strong>en</strong>te el compilador no t<strong>en</strong>drá ningún problema para utilizar inline, pero si hay muchas s<strong>en</strong>t<strong>en</strong>cias, la sobrecarga de llamada será mucho m<strong>en</strong>or que el coste de ejecutar el cuerpo. Y recuerde, cada vez que llame a una función inline grande, el cuerpo completo se inserta <strong>en</strong> el lugar de la llamada, de modo que el tamaño del código se inflará fácilm<strong>en</strong>te sin que se perciba ninguna mejora de r<strong>en</strong>dimi<strong>en</strong>to. (Note que algunos de los ejemplos de este libro pued<strong>en</strong> exceder el tamaño razonable para una inline a cambio de mejorar la estética de los listados. El compilador tampoco efectúa sustituciones inline si la dirección de la función se toma implícita o explícitam<strong>en</strong>te. Si el compilador debe producir una dirección, <strong>en</strong>tonces t<strong>en</strong>drá que alojar el código de la función y usar la dirección resultante. Sin embargo, cuando no se requiere una dirección, probablem<strong>en</strong>te el compilador hará la sustitución inline. Es importante compr<strong>en</strong>der que una declaración inline es sólo una suger<strong>en</strong>cia al compilador; el compilador no está forzado a hacer nada. Un bu<strong>en</strong> compilador hará sustituciones inline para funciones pequeñas y simples mi<strong>en</strong>tras que ignorará las que sean demasiado complicadas. Eso le dará lo que espera - la auténtica semántica de una llamada a función con la efici<strong>en</strong>cia de una macro. 9.4.2. Refer<strong>en</strong>cias adelantadas Si está imaginando que el compilador [FIXME: is doing to implem<strong>en</strong>t inlines], puede confundirse p<strong>en</strong>sando que hay más limitaciones que las que exist<strong>en</strong> realm<strong>en</strong>te. En concreto, si una inline hace una refer<strong>en</strong>cia adelanta a una función que no ha sido declarada aún <strong>en</strong> la clase (sea inline o no), puede parecer que el compilador no sabrá tratarla. //: C09:EvaluationOrder.cpp // Inline evaluation order class Forward { 265 ✐ ✐ ✐ ✐