Inline de funciones vararg

Mientras jugaba con la configuración de optimización, noté un fenómeno interesante: funciones que toman un número variable de argumentos (...) nunca parecía estar en línea. (Obviamente, este comportamiento es específico del compilador, pero lo he probado en un par de sistemas diferentes).

Por ejemplo, compilando el siguiente pequeño programa:

#include <stdarg.h>
#include <stdio.h>

static inline void test(const char *format, ...)
{
  va_list ap;
  va_start(ap, format);
  vprintf(format, ap);
  va_end(ap);
}

int main()
{
  test("Hello %s\n", "world");
  return 0;
}

aparentemente siempre resultará en un (posiblemente mutilado)test símbolo que aparece en el ejecutable resultante (probado con Clang y GCC en los modos C y C ++ en MacOS y Linux). Si se modifica la firma detest() tomar una cadena simple que se pasa aprintf(), la función está en línea desde-O1 hacia arriba por ambos compiladores como era de esperar.

Sospecho que esto tiene que ver con la magia vudú utilizada para implementar varargs, pero la forma exacta en que se hace esto es un misterio para mí. ¿Alguien puede aclararme cómo los compiladores suelen implementar funciones vararg y por qué esto aparentemente evita la inserción?

Respuestas a la pregunta(4)

Su respuesta a la pregunta