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