resueltos internas ejercicios ejemplos codigo clases anonimas c++ inline

c++ - internas - Método en línea: definición de clase interna vs externa



codigo de clases en c++ (3)

Si tiene un método y desea darle al compilador una pista de que es una buena idea incluirlo, actualmente tiene dos soluciones. El primero es definir los métodos cuando declara su clase:

class Vector { private: double* data_; double* size_; double* capacity_; public: double& operator[](int k) { return data_[k]; } ... }

Como este método puede reducir la legibilidad, otra solución es usar la palabra clave en inline y definir el método fuera de clase:

class Vector { private: double* data_; double* size_; double* capacity_; public: inline double& operator[](int k); ... } double& Vector::operator[](int k) { return data_[k]; }

Esto hace que el código sea más legible (al menos yo lo prefiero). Leyendo mi implementación de STL , encontré que usan una mezcla de los dos. Algunos métodos (aquellos que creo que realmente deberían estar en línea) se definen en la clase, y otros se definen fuera de clase con la palabra clave en línea. El archivo también comienza con una declaración comentada de la clase.

Así que mi pregunta es la siguiente. ¿Es más probable que los compiladores actuales (estoy pensando en GCC , Clang , Intel y Visual Studio ) integren una función miembro que se declara dentro de la clase que una función miembro declarada fuera de clase con la palabra clave en línea?

Observación: esta pregunta no es un duplicado de ¿ Cuándo debo escribir la palabra clave ''en línea'' para una función / método? Como mi pregunta es sobre implementaciones de compilador. Haz estas dos formas de decir que quieres que esas funciones estén en línea son equivalentes. La forma en que se escribe la STL sugiere que no lo son.


¿Es más probable que los compiladores actuales (estoy pensando en gcc, clang, Intel, Visual Studio) integren una función miembro que se declara dentro de la clase que una función miembro declarada fuera de clase con la palabra clave en línea?

No hace absolutamente ninguna diferencia en absoluto.

Como han señalado los demás, en un compilador moderno en inline es poco más que un modificador de vinculación. La incorporación real se controla mediante indicadores de optimización, requisitos de vinculación y atributos específicos del compilador.


La palabra clave en inline se considera una sugerencia para los compiladores, sin embargo, la mayoría de los compiladores son mucho mejores para decidir qué en línea que los programadores, por lo que generalmente ignoran esta sugerencia .

El uso principal (¿solo?) De la palabra clave en inline hoy en día es para permitir que las funciones se definan en el encabezado y no generen múltiples errores de enlace de definición (lo que no tiene nada que ver con la inclusión en línea).

También tenga en cuenta que la alineación ocurre en un sitio de llamada de función , por lo que no tiene sentido decir que una función está en línea ya que puede estar en línea en algunos lugares y no en otros (según el código que la rodea).

Mi consejo: usa lo que crees que es más legible ya que no tendrá ningún impacto en la alineación real (a menos que uses un compilador específico como __forceinline (no hagas eso)).


Los métodos definidos dentro de la definición de clase están en inline por defecto. La elección de uno u otro es, a lo sumo, un obstáculo menor para el compilador cuando se trata de la optimización, lo más probable es que no importa cuál elija.