看一下godbolt 上这个C代码或C++代码的小片段......
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);
}
Run Code Online (Sandbox Code Playgroud)
早期版本的gcc将a()和c()编译为两条指令,加载z的地址,跳转到b.
所有现代编译器我都试图"悲观化"a()以"制作堆栈帧,将z复制到堆栈,调用b,拆除堆栈帧,但将c()作为两个指令简单版本.
实际上没有任何改变,在实践中现代编译器现在对这个用例来说更慢.....
有谁知道为什么?