Посмотрите на этот крошечный фрагмент кода C или кода C++ на 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);
}
Более ранние версии gcc компилируют a() и c() в две инструкции, загружают адрес z, переходят в b.
Все современные компиляторы, которые я пытался "пессимизировать" a(), чтобы "создать кадр стека, скопировать z в стек, вызвать b, разбить кадр стека, но оставить c() как простую версию с двумя инструкциями.
По сути, ничего не изменилось, на практике современные компиляторы теперь работают медленнее для этого варианта использования.....
У кого-нибудь есть идеи, почему?