Pregunta

Encuentro muchos recursos en línea sobre cómo inline (e incluso __attribute__((always_inline)) o __forceinline) no obliga al compilador (por ejemplo, GCC o VisualC ++) en línea en la función. ¿Pero cuándo no se aplicará exactamente en línea? ¿Hay un ejemplo de juguete?

Quizás no necesariamente la misma pregunta, ¿cuándo se etiqueta una función con inline ¿Incluido en dos archivos CPP diferentes crean problemas durante el enlace? A saber, generar símbolos duplicados?

Aquí hay una caja de arena de concreto para tratar de romper el compilador en la entrada y generar un símbolo duplicado:

En myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

En aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

En main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

Luego, por ejemplo, en el caso de GCC, hay algún código (mínimo) para myinline Eso causará un símbolo duplicado al compilar y vincular con:

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

¿Fue útil?

Solución

"Entradas" y "símbolos duplicados" son cosas diferentes. los inline Las palabras clave permiten explícitamente múltiples definiciones (es decir, lo exime de la regla de una definición), por lo que la plataforma (compilador y enlazador) debe saber cómo manejarlo y deduplicarla.

(Esto sucede todo el tiempo para las funciones de los miembros de la clase que se definen en los encabezados).

Si solo quieres codigo de GENERACION Para suceder, puede almacenar la dirección de la función en algún lugar:

auto fp = my_inline;

De esa manera, el compilador debe generar una definición de la función, para poder darle una dirección. Pero incluso si hace esto en cada unidad de traducción, no obtendrá un error de enlazador, ya que esto se deducirá en la hora de enlace. El requisito de que todas las definiciones sean idénticas aseguran que esto esté bien definido.

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