Dado que las plantillas se definen dentro de los encabezados y el compilador es capaz de determinar si una función inline es ventajoso, żtiene algún sentido? He oído que los compiladores modernos saben mejor cuando se para en línea de una función y están ignorando inline sugerencia.


edit: me gustaría aceptar ambas respuestas, pero esto no es posible. Para cerrar el tema estoy aceptando phresnel‘s respuesta, porque recibió la mayoría de votos y él es formalmente correcto, pero como he mencionado en los comentarios considero Cachorro‘s y Componente 10‘s respuestas correcta también, desde otro punto de vista.

El problema es que en C++ semántica, que no es estricta en el caso de inline y palabra clave inline. phresnel dice «escribir en línea si usted en serio», pero lo que realmente se entiende por inline no está claro como se desarrolló a partir de su significado original, para una directiva que «deja de compiladores quejándose acerca de la ODR violaciones» como Cachorro dice.

InformationsquelleAutor doc | 2012-05-10

3 Comentarios

  1. 93

    No es irrelevante. Y no, no todos plantilla de función es inline por defecto. El estándar es aún explícito al respecto en Explícita especialización ([temp.expl.spec])

    Tienen las siguientes:

    a.cc

    #include "tpl.h"

    b.cc

    #include "tpl.h"

    tpl.h (tomado de Explícito Especialización):

    #ifndef TPL_H
    #define TPL_H
    template<class T> void f(T) {}
    template<class T> inline T g(T) {}
    
    template<> inline void f<>(int) {} //OK: inline
    template<> int g<>(int) {} //error: not inline
    #endif

    Compilar este, et voila:

    g++ a.cc b.cc
    /tmp/ccfWLeDX.o: In function `int g<int>(int)':
    inlinexx2.cc:(.text+0x0): multiple definition of `int g<int>(int)'
    /tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here
    collect2: ld returned 1 exit status

    No se indica inline al hacer explícita la creación de instancias también puede conducir a problemas.

    Así que en resumen: Para los que no totalmente especializado función de las plantillas, es decir, aquellos que llevan al menos un tipo desconocido, puede omitir inline, y no tiene errores, pero aún así no son inline. Para la plena especializaciones, es decir, los que utilizan sólo los tipos conocidos, usted no puede omitirlo.

    Propuesta de regla de pulgar: Escribir inline si te refieres a él y simplemente ser coherente. Que te hace pensar menos acerca de si o no para que sólo porque usted puede. (Esta norma no se ajusta a Vandevoorde s/Josuttis del plantillas de C++: La Guía Completa).

    • Es cierto explícita de especializaciones – son como funciones normales. Pero aquí -> template<class T> inline T g(T) {} en línea no es necesario y podría haber escrito template<class T> T g(T) {}
    • Uno podría haber escrito, la verdad. Pero eso no implica inlineness, incluso si parece como que. Vandevoorde y Josuttis también precisar que en las Plantillas de C++: La Guía completa
    • Hay un poco más débiles de la declaración de que las plantillas pueden tener varias definiciones (3.2/5) –> stackoverflow.com/a/10211420/205955 estoy de acuerdo en que esto no implica que sean formalmente en línea. Sin embargo, todo se reduce a esto en la práctica. Así, ambas respuestas son correctas desde diferentes puntos de vista.
    • He añadido una regla-de-pulgar. Personalmente no me gusta la omisión de inline sólo porque puede, y, a continuación, vuelva a introducir cuando debe. Yo realmente prefiero decir línea cuando te refieres a ella.
    • La explícita la especialización no es una plantilla.
    • Sin embargo, una función normal es preferido sobre un total de especialización en la búsqueda, así que si no son de plantilla, ni la no-plantilla, ¿qué son entonces?
    • Por alguna razón el enlace de arriba no funciona para mí. El desciframiento de la URL que he entendido el vínculo necesario para que apunte a la página 72: libros.google.co.reino unido/…
    • Para mí todavía funciona, extraño.
    • No estoy seguro de entender lo que quieres decir por «Escribir en línea si usted quiere decir que…». Cuando podrías no «significa» inline para una plantilla?
    • Al igual que con las funciones normales. Esto es un poco como preguntar Cuando podrías posible no «significa» mov eax, alpha por una adición. Con no en línea de la plantilla de funciones, quiero los mismos beneficios de la no-inline no-plantilla de funciones.
    • Esta respuesta es incorrecta. Una explícita de que la especialización de una plantilla es una función, no una plantilla. Esa función no se inline sólo porque la plantilla que estaba especializado está marcado con inline. Así inline en la plantilla es completamente irrelevante. Si que debería ser la función inline o no tiene nada que hacer a partir de ella se genera a través de una especialización de plantilla (y hay respuestas mejores que esta que la dirección, al utilizar inline). @Cachorro ‘s respuesta es correcta, este no es el caso. La adición de inline en una plantilla es irrelevante, y clang-tidy retira de ella.
    • Asimismo, en el ejemplo sólo muestra ODR problemas para el funcionamiento normal (el comportamiento no tiene nada que ver con las plantillas). Para intentar mostrar que inline no es irrelevante, el ejemplo debe incluir, en el caso de que explícitamente se especializa template<> void f<>(int) {} sin el inline palabra clave. Pero incluso después de cambiar los inline especificador en la plantilla no hace ninguna diferencia, porque si usted marca la plantilla inline o no es irrelevante.

  2. 29

    Es irrelevante. Todas las plantillas ya están inline– por no hablar de que a partir de 2012, el sólo uso de la inline palabra clave es dejar de compiladores quejándose acerca de la ODR violaciones. Usted está absolutamente en lo correcto – su actual generación compilador sabrá qué en la línea de lo propio y, probablemente, puede hacerlo incluso entre unidades de traducción.

    • La norma no indica que todas las plantillas en línea.
    • Pero las plantillas tienen la misma semántica que inlinemarcada funciones (es decir, varias definiciones equivalentes que se pueden pasar al enlazador, que se encargará de seleccionar uno). Que, no inline, es la verdadera función de la inline palabra clave.
    • Yo sé acerca de la ODR significado de inline. Tal vez echar un vistazo a mi respuesta de abajo (o arriba, dependiendo de clasificación elegido). Para los no especializados de plantillas, que son, por supuesto, a la derecha, pero formalmente no es el mismo.
    • No hay ninguna diferencia entre una función de plantilla y un inline uno, así que si o no la Norma establece que es irrelevante.
    • No existe ningún requisito en C++ que una plantilla de función debe ser implementado en un archivo de encabezado; puede ser implementado en cualquier lugar. Para reflejar esto, tiendo a recomendar etiquetado inline lo que se supone que estar en línea. Normalmente no hace ninguna diferencia, pero en standardese, que no son el mismo, y no todos ellos están en línea. Acepto tu postura sobre ella diciendo: «Es irrelevante», pero por la norma, no todas las plantillas son en línea, sólo para usted como C++-usuario aparecen como si.
    • Tu comentario sobre la aceptada respuesta que explícita la especialización no es una plantilla (que es obvio después se dijo así, por supuesto….) es quizás lo más importante en esta página. ¿Te importaría añadir a tu respuesta así?

  3. 3

    Como usted sugiere, inline es una sugerencia para que el compilador y nada más. Puede ignorarlo o, de hecho, para las funciones en línea no marcó en línea.

    Utilizando inline con plantillas que se usan para ser un (pobre) forma de sortear el problema de que cada unidad de compilación sería crear un objeto independiente para la misma clase de plantilla que podría provocar problemas de duplicación en el momento de enlazar. Mediante el uso de inline (creo) el nombre de daños en obras diferentes que viene el nombre de choque en el momento de enlazar, pero a expensas de muy hinchado código.  

    Marshall Cline lo explica aquí mejor que yo.

    • Que no solía ser el caso. Marque aquí: gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/… supongo que ha cambiado más recientemente, es por eso que yo estaba hablando en pasado.
    • Puede que me apunte a la parte de La Norma que establece que la función de las plantillas están siempre en línea? Porque, no lo son.
    • Muy interesante, yo podría jurar que he leído que en el estándar. Tal vez me la ha mezclado con el hecho de que la función de las plantillas están exentos de la ODR (§14.5.5.1 p7 & p8). Mi mal, me quita el mal comentario.
    • 10 ¿por Qué crees que es mala manera de conseguir redondo problema de compilación

Dejar respuesta

Please enter your comment!
Please enter your name here