Pregunta

public:
     inline int GetValue() const {
          return m_nValue;
     }
     inline void SetValue(int nNewValue) {
          this -> m_nValue = nNewValue;
     }

Aprender C ++ , que dijo que correr más rápido. Por lo tanto, pensé que sería una buena idea utilizar el captadores y definidores. Pero tal vez, hay algunos inconvenientes a ella?

¿Fue útil?

Solución

No hago nada en línea hasta que un perfilador me ha dicho específicamente que no inlining está dando lugar a un problema de rendimiento.

El compilador de C ++ es muy inteligente y es casi seguro que de forma automática en línea como función simple como esto para usted. Y por lo general es más inteligente de lo que eres y lo hará un trabajo mucho mejor en la determinación de lo que debe o no debe ser inline.

Yo evitaría el pensamiento sobre lo que debe o no en línea y enfoque en la solución. La adición de la palabra clave inline tarde (que no es una garantía de línea por cierto) es muy fácil de hacer y lugares potenciales se puede encontrar fácilmente con un generador de perfiles.

Otros consejos

Si los escribe dentro de la definición, que se consideran inline por defecto .

Esto significa que van a ser permitidos en múltiples unidades de compilación (ya que las definiciones de clase a sí mismos por lo general aparecen en múltiples unidades de compilación), no que van a realidad ser inline.

Se trata de malas prácticas en la API pública de cualquier cambio a estas funciones requiere recopilación de todos los clientes.

En general que tienen captadores y definidores está mostrando mala abstracción, no lo haga. Si usted está constantemente va a los datos en bruto en otra clase, entonces es probable que tenga que volver a organizar sus clases, en lugar de considerar la forma en que desea manipular los datos dentro de una clase y proporciona métodos apropiados para hacerlo.

Los puntos negativos:

  1. El compilador es libre de hacer caso omiso de usted.

  2. Cualquier cambio a estas funciones requiere recopilación de todos los clientes.

  3. Un buen compilador inline funciones no inline de todos modos cuando es apropiado.

También me gustaría añadir que, a menos que se está realizando millones de Establece / Obtiene por cuadro, es prácticamente irrelevante si estos están entre líneas o no. Es verdad es que no vale la pena perder el sueño por.

Además, tenga en cuenta que con sólo poner la palabra 'inline' en frente de su declaración + definición, no significa que el compilador inline su código. Es usos diferentes heurísticas para encontrar si tiene sentido, que es a menudo el comercio clásico fuera de la velocidad vs tamaño. Sin embargo, existe la fuerza bruta '__forceinline' palabra clave, en arrendamiento en VC ++ (no estoy seguro de lo que está en GCC), que pisa la heurística compiladores de lujo. Realmente no lo recomiendo en absoluto, y además, una vez que el puerto a una arquitectura diferente, es probable que sea incorrecta.

Trate de poner todas las definiciones de funciones en el archivo de implementación, y dejar las declaraciones puros de las cabeceras (a menos que por supuesto que eres metaprogramming plantilla (STL / BOOST / etc), en cuyo caso, casi todo lo que se encuentra en las cabeceras ;))

Uno de los lugares clásicos como las personas a línea (al menos en los videojuegos, que es de donde soy), se encuentra en las cabeceras de matemáticas. Cross / DOT productos, longitudes vectoriales, compensación matriz, etc a menudo son colocados en la cabecera, que sólo pienso es innecesario. 9/10 no hace ninguna diferencia en el rendimiento, y si alguna vez tiene que hacer un bucle estrecho, tales como transformar una matriz grande del vector por alguna matriz, que es probablemente mejor de hacerlo manualmente la línea de matemáticas, o incluso mejor en la codificación plataforma específica ensamblador.

Ah, y otro punto, si se siente que realmente necesita una clase para ser más datos que el código, considere el uso de una buena estructura de edad, que no hace que dicho equipaje OO de la abstracción con él, eso es lo que está ahí para. :)

Lo sentimos, no tenía intención de ir a tanto, pero yo sólo creo que ayuda a considerar los casos de uso del mundo real, y no se obsesione con la configuración del compilador pedantes (confía en mí, he estado allí;))

Buena suerte.

Shane

El código compilará un poco más largo y se pierde la encapsulación. Todo depende del tamaño del proyecto y su naturaleza. En la mayoría de los casos está bien para hacerlos en línea si no tienen ninguna lógica compleja.

Por cierto, puede omitir inline si implementa directamente en la definición de clase.

Al poner el código en la cabecera, usted está exponiendo sus trabajos de clase internas. Los clientes pueden ver esto y supuestos toman de cómo funciona su clase. Esto puede hacer que sea más difícil para cambiar su clase más adelante sin romper el código del cliente.

Yo diría que usted no tiene que molestarse con eso. Lea la sección FAQ sobre inlining .

No es necesario, empezar a confiar en los compiladores, al menos para este tipo de optimizaciones
"Pero no siempre"

La palabra clave en línea no tiene sentido en su caso

Compilador inline su función si puede y quiere, independientemente de la palabra clave.

La línea de palabras clave afecta a la vinculación y no inline. Se confunde un poco, pero leer sobre él.

Si la definición se encuentra en una unidad diferente compilación (archivo de origen después de preprocesador, básicamente) que la llamada, inlining sólo será posible si la optimización de todo el proyecto y el enlace de generación de código de tiempo están habilitadas. Permitiendo que aumenta en gran medida el tiempo (ya que prácticamente re-compila todo en el enlazador) que une, pero, obviamente, puede mejorar el rendimiento. No estoy seguro si es encendido o apagado por defecto en GCC y VS.

Tengo que decir, no tengo la fuerte aversión a esta práctica que otros en este hilo parecen tener. Estoy de acuerdo en que la ganancia de rendimiento de procesos en línea es insignificante en todos pero el más utilizado de los casos. (Y sí, I Tienes encontradas tales casos en la práctica.) Cuando hago este tipo de inclusión entre líneas, lo hago por conveniencia, y por lo general sólo para una sola línea de este tipo. En la mayoría de mis casos de uso, la necesidad de recompilación evitar en el lado del cliente si alguna vez cambio de ellos simplemente no es tan fuerte.

Sí, se puede eliminar la inline, ya que está implícito en la colocación de la aplicación.

Además, estoy un poco sorprendido por la vehemencia contra descriptores de acceso. Difícilmente se puede estornudar en una clase en cualquier lenguaje orientado a objetos sin soplar unos pocos hacia abajo, y que después de todo son una técnica válida para la implementación abstracta de la interfaz, así que es un poco masoquista para reclamarlos como mala práctica OO. Es es un buen consejo no descriptores de acceso de escritura de manera indiscriminada, pero también le aconsejo que no se deje llevar en el celo para erradicarlos.

Toma eso, los puristas. : -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top