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

米查斯

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

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);
}

该函数a_proc_s将尝试在a_var每次调用时从内存中重新加载extern_proc该功能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资源管理器

亚视

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么我们不能用从类型变量未初始化的局部变量访问静态内容?

来自分类Java

静态类中的重复局部变量

来自分类Java

要在哪些对象上进行同步?为什么局部变量不好?

来自分类Java

为什么Java中没有局部静态变量?

来自分类Java

为什么局部变量在Java中是线程安全的

来自分类Java

为什么增强的for循环的局部变量必须是局部的?

来自分类Java

为什么将方法参数重新分配给局部变量?

来自分类Java

为什么局部变量在Java中也称为“自动”?

来自分类Java

静态方法中的局部变量是否也是静态的?

来自分类Java

什么是线程中的局部变量?

来自分类Java

为什么Java允许在匿名内部类中重新分配类级别的变量,而局部变量不允许这样做

来自分类Dev

Go中的静态局部变量

来自分类Dev

为什么局部变量不会在数组定义中隐藏全局变量

来自分类Dev

C ++ 11中的静态局部变量?

来自分类Dev

C ++中静态局部变量的范围和生存期

来自分类Dev

为什么局部变量实例化失败,而静态变量实例化失败?

来自分类Dev

为什么lambda对象中的局部变量是const?

来自分类Dev

关于Java中的Singleton模式,为什么不直接将静态变量分配给方法中的新局部变量,为什么不直接使用静态变量呢?

来自分类Dev

C中的局部变量和内存

来自分类Dev

在C中访问bash局部变量

来自分类Dev

为什么根据Lua中的模块,将模块加载到局部变量或全局变量意味着结果不同?

来自分类Dev

为什么局部变量会在Python中循环

来自分类Dev

为什么分配给堆栈中的局部变量的内存比C ++所需的内存多?

来自分类Dev

当存储该引用的局部变量设置为null时,为什么静态变量没有设置为null?

来自分类Dev

为什么在类中定义的变量不是局部变量而是Java中的实例变量?

来自分类Dev

静态局部变量中的竞争条件

来自分类Dev

静态局部变量被重新初始化

来自分类Dev

我在C中的局部变量?

来自分类Dev

局部变量的内存被重新分配 - 为什么

Related 相关文章

  1. 1

    为什么我们不能用从类型变量未初始化的局部变量访问静态内容?

  2. 2

    静态类中的重复局部变量

  3. 3

    要在哪些对象上进行同步?为什么局部变量不好?

  4. 4

    为什么Java中没有局部静态变量?

  5. 5

    为什么局部变量在Java中是线程安全的

  6. 6

    为什么增强的for循环的局部变量必须是局部的?

  7. 7

    为什么将方法参数重新分配给局部变量?

  8. 8

    为什么局部变量在Java中也称为“自动”?

  9. 9

    静态方法中的局部变量是否也是静态的?

  10. 10

    什么是线程中的局部变量?

  11. 11

    为什么Java允许在匿名内部类中重新分配类级别的变量,而局部变量不允许这样做

  12. 12

    Go中的静态局部变量

  13. 13

    为什么局部变量不会在数组定义中隐藏全局变量

  14. 14

    C ++ 11中的静态局部变量?

  15. 15

    C ++中静态局部变量的范围和生存期

  16. 16

    为什么局部变量实例化失败,而静态变量实例化失败?

  17. 17

    为什么lambda对象中的局部变量是const?

  18. 18

    关于Java中的Singleton模式,为什么不直接将静态变量分配给方法中的新局部变量,为什么不直接使用静态变量呢?

  19. 19

    C中的局部变量和内存

  20. 20

    在C中访问bash局部变量

  21. 21

    为什么根据Lua中的模块,将模块加载到局部变量或全局变量意味着结果不同?

  22. 22

    为什么局部变量会在Python中循环

  23. 23

    为什么分配给堆栈中的局部变量的内存比C ++所需的内存多?

  24. 24

    当存储该引用的局部变量设置为null时,为什么静态变量没有设置为null?

  25. 25

    为什么在类中定义的变量不是局部变量而是Java中的实例变量?

  26. 26

    静态局部变量中的竞争条件

  27. 27

    静态局部变量被重新初始化

  28. 28

    我在C中的局部变量?

  29. 29

    局部变量的内存被重新分配 - 为什么

热门标签

归档