¿Por qué hay ahora una diferencia entre “{static const char a [] = {...}” y “{const char a [] = {...}”

Eche un vistazo a este pequeño fragmento deC código o Código C ++ en godbolt ...

void b( char const *c);

void a(void)
{
   char const z[] = {0xd, 0xe, 0xa, 0xd, 0xb, 0xe, 0xe, 0xf, 0xa};

   b(z);
}

void c(void)
{
   static char const z[] = {0xd, 0xe, 0xa, 0xd, 0xb, 0xe, 0xe, 0xf, 0xa};

   b(z);
}

Las versiones anteriores de gcc compilan tanto a () como c () a dos instrucciones, cargan la dirección de z, saltan a b.

Todos los compiladores modernos intenté "pesimizar" a () para "hacer el marco de la pila, copiar z en la pila, llamar a b, derribar el marco de la pila, pero dejar c () como la versión simple de dos instrucciones.

En efecto, nada ha cambiado, en la práctica los compiladores modernos ahora son más lentos para este caso de uso .....

¿Alguien tiene alguna idea de por qué?

Respuestas a la pregunta(2)

Su respuesta a la pregunta