gpt4 book ai didi

c - 为什么要重新加载 C 中的静态局部变量?

转载 作者:太空宇宙 更新时间:2023-11-04 05:51:37 24 4
gpt4 key购买 nike

我发现了一个关于局部静态变量的有趣行为。编译器每次都尝试重新加载它们。以下是代码示例。

extern void extern_proc(int a, int b);
void a_proc_s() {
static int a_var = 0;
a_var++;
extern_proc(a_var, 1);
extern_proc(a_var, 2);
extern_proc(a_var, 3);
extern_proc(a_var, 4);
extern_proc(a_var, 5);
extern_proc(a_var, 6);
}
void a_proc_r() {
static int a_var = 0;
register int r_var = ++a_var;
extern_proc(r_var, 1);
extern_proc(r_var, 2);
extern_proc(r_var, 3);
extern_proc(r_var, 4);
extern_proc(r_var, 5);
extern_proc(r_var, 6);
}

每次调用 extern_proc 时,函数 a_proc_s 都会尝试从内存中重新加载 a_var。函数 a_proc_r 将使用寄存器的本地副本。 为什么编译器不能在前一个函数中优化这个负载?

下面是来自 x86_64 汇编程序的有趣片段。其他架构类似。

;Fragment for a_proc_s
movl a_proc_s.a_var(%rip), %edi
movl $2, %esi
callq extern_proc
movl a_proc_s.a_var(%rip), %edi
movl $3, %esi
callq extern_proc

;Fragment for a_proc_r
movl $2, %esi
movl %ebx, %edi
callq extern_proc
movl $3, %esi
movl %ebx, %edi
callq extern_proc

GCC Explorer

最佳答案

编译器无法确保 extern_proc 永远不会调用 a_proc_s,修改静态变量。

关于c - 为什么要重新加载 C 中的静态局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40052796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com