Por que agora existe uma diferença entre “{static const char a [] = {…}” e “{const char a [] = {…}”?

Dê uma olhada neste pequeno trecho de Código C ou Código C ++ em 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);
}

s versões anteriores do gcc compilam a () e c () para duas instruções, carregam o endereço de z, saltam para

odos os compiladores modernos tentei "pessimizar" a () para "criar quadro de pilha, copiar z para pilha, chamar b, derrubar quadro de pilha, mas deixar c () como a versão simples de duas instruções.&quo

Na verdade, nada mudou; na prática, os compiladores modernos agora são mais lentos para esse caso de uso .....

Alguém tem alguma idéia do porqu

questionAnswers(2)

yourAnswerToTheQuestion