Pregunta

Sé que el compilador puede o no realizar la expansión en línea de una función, ya sea que lo solicite el programador o no.
Tenía curiosidad por saber, ¿hay alguna forma en que el programador pueda saber con certeza que el compilador ha inclinado una función particular?

¿Fue útil?

Solución

Aparte de mirar el código generado, no. Algunas implementaciones pueden proporcionar esa información, pero el estándar no la requiere.

Cosas como inline o register (estremecimiento) son sugerencias al compilador y es gratis aceptarlos, ignorarlos o incluso mentirle que lo haya hecho mientras se va en secreto a sus espaldas y no lo hace :-)

Tiendo a no usar características como esa, ya que sospecho que el compilador a menudo sabe mejor que cómo sacar el mayor rendimiento de mi código.

Otros consejos

Puede perfilar su código y ver si la función de interés aparece en la pila de llamadas. Aunque, supongo que no hay garantía si su tasa de muestreo de pila no es lo suficientemente alta.

Pero puede demostrar que está en lo que está en lo que sabe A llamadas B, que llama C, y A Nunca llame C directamente, si ves A vocación C En la pila de llamadas, ya sabes B fue inscrito para esa llamada.

Establezca su compilador para generar código de ensamblador y verifique allí.

Lea el desmontaje del archivo de objeto.

No hay forma de saberlo, excepto mirar el ensamblador de salida.

Los compiladores en estos días son "inteligentes" y deciden qué funciones en línea y en qué casos.

Al igual que la palabra clave de registro, los compiladores eligen en estos días e ignoran sus solicitudes.

No creo que haya una manera de averiguar lo que quieres

Pero puede aumentar las posibilidades de que la función sea una función en línea por,

Haciendo que la definición de la función sea visible para la unidad de traducción en la que se llama. es decir, siempre tienes que poner la definición de una función en línea en el archivo de encabezado.

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