Considere el archivo de encabezado:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
o alternativamente:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
En un mundo previo a los módulos, estos encabezados pueden incluirse textualmente en múltiples TU sin infracciones de ODR. Además, dado que las funciones miembro involucradas son relativamente pequeñas, es probable que el compilador "en línea" (evite las llamadas a funciones al usar) esas funciones, o incluso optimice algunas instancias por T
completo.
En un informe reciente sobre la reunión donde se terminó C ++ 20, pude leer la siguiente declaración:
Aclaramos el significado de las
inline
interfaces en el módulo: la intención es que los cuerpos de funciones que no se declaran explícitamenteinline
no sean parte de la ABI de un módulo, incluso si esos cuerpos de funciones aparecen en la interfaz del módulo. Para dar a los autores de módulos más control sobre su ABI, las funciones miembro definidas en los cuerpos de clase en las interfaces de módulos ya no están implícitamenteinline
.
No estoy seguro de no estar equivocado. ¿Eso significa que, en un mundo de módulos, para que el compilador pueda optimizar las llamadas a funciones, tenemos que anotarlas como inline
si estuvieran definidas en clase?
Si es así, ¿la siguiente interfaz del módulo sería equivalente a los encabezados anteriores?
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
Aunque todavía no tengo un compilador con soporte de módulos, me gustaría comenzar a usarlo inline
así cuando sea apropiado, para minimizar la futura refactorización.
inline
palabra clave nunca será alineada por el compilador, ¿correcto?