Saltar a contenido

Última actualización:2026-10-12

Funciones inline en C++

Sobre el autor:

Cuenta pública personal de WeChat:

wechat

1. inline dentro de una clase

Declaración de métodos en el archivo de cabecera

class A
{
public:
    void f1(int x); 

    /**
     * @brief 类中定义了的函数是隐式内联函数,声明要想成为内联函数,必须在实现处(定义处)加inline关键字。
     *
     * @param x
     * @param y
     */
    void Foo(int x,int y) ///< 定义即隐式内联函数!
    {

    };
    void f2(int x); ///< 声明后,要想成为内联函数,必须在定义处加inline关键字。  
};
Definir funciones inline en el archivo de implementación:

#include <iostream>
#include "inline.h"

using namespace std;

/**
 * @brief inline要起作用,inline要与函数定义放在一起,inline是一种“用于实现的关键字,而不是用于声明的关键字”
 *
 * @param x
 * @param y
 *
 * @return 
 */
int Foo(int x,int y);  // 函数声明
inline int Foo(int x,int y) // 函数定义
{
    return x+y;
}

// 定义处加inline关键字,推荐这种写法!
inline void A::f1(int x){

}

int main()
{


    cout<<Foo(1,2)<<endl;

}
/**
 * 编译器对 inline 函数的处理步骤
 * 将 inline 函数体复制到 inline 函数调用点处;
 * 为所用 inline 函数中的局部变量分配内存空间;
 * 将 inline 函数的的输入参数和返回值映射到调用方法的局部变量空间中;
 * 如果 inline 函数有多个返回点,将其转变为 inline 函数代码块末尾的分支(使用 GOTO)。
 */
El inline puede mejorar la eficiencia de las funciones, ¡pero no todas las funciones deben definirse como inline! El inline se paga con la expansión del código (copias): solo ahorra el coste de la llamada a la función, y así mejora la eficiencia de ejecución de la función.

  • Si el tiempo de ejecución del código del cuerpo de la función es grande comparado con el coste de la llamada, ¡la ganancia de eficiencia será menor!

  • Por otro lado, cada llamada a la función inline copia código, lo que aumenta el tamaño total del código del programa y consume más espacio de memoria.

No conviene usar inline en los casos siguientes:

(1) Si el código del cuerpo de la función es bastante largo, el inline supondrá un coste de memoria elevado.

(2) Si en el cuerpo de la función hay bucles, el tiempo de ejecución del código del cuerpo será mayor que el coste de la llamada a la función.

2. ¿Puede una función virtual (virtual) ser una función inline (inline)?

  • Una función virtual puede ser una función inline; inline puede calificar a una función virtual, pero cuando la función virtual muestra polimorfismo no puede expandirse inline.
  • El inline es, en tiempo de compilación, una sugerencia al compilador de expandir; en cambio, el polimorfismo de las funciones virtuales ocurre en tiempo de ejecución y el compilador no puede saber qué código se llama entonces, por lo que cuando una función virtual se comporta polimórficamente (en tiempo de ejecución) no puede expandirse inline.
  • El único caso en que inline virtual puede expandirse inline es cuando el compilador sabe de qué clase es el objeto llamado (por ejemplo Base::who()), lo que solo ocurre cuando el compilador tiene el objeto real y no un puntero o una referencia al objeto.
#include <iostream>  
using namespace std;
class Base
{
public:
    inline virtual void who()
    {
        cout << "I am Base\n";
    }
    virtual ~Base() {}
};
class Derived : public Base
{
public:
    inline void who()  // 不写inline时隐式内联
    {
        cout << "I am Derived\n";
    }
};

int main()
{
    // 此处的虚函数 who(),是通过类(Base)的具体对象(b)来调用的,编译期间就能确定了,所以它可以是内联的,但最终是否内联取决于编译器。 
    Base b;
    b.who();

    // 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。  
    Base *ptr = new Derived();
    ptr->who();

    // 因为Base有虚析构函数(virtual ~Base() {}),所以 delete 时,会先调用派生类(Derived)析构函数,再调用基类(Base)析构函数,防止内存泄漏。
    delete ptr;
    ptr = nullptr;


    return 0;
} 

Temas relacionados

Comentarios