Última actualización:2026-10-12
Funciones inline en C++¶
Sobre el autor:¶
Cuenta pública personal de 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关键字。
};
#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)。
*/
-
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 virtualpuede expandirse inline es cuando el compilador sabe de qué clase es el objeto llamado (por ejemploBase::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¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事