静态全局变量可以优化为堆栈吗?

时间:2018-02-13 16:54:19

标签: c optimization

假设我在C文件中声明了一个静态全局变量:

NullPointerExceptions

并且只在该文件中的一个函数中使用它:

static int my_var = 0;

这里重要的是static void func1(void) { my_var = 1; my_var++; printf("my_var = %d\n", my_var); } 被一个值覆盖(在这种情况下为1,但可能是函数或计算)。 假设my_var将始终在my_var中以预先确定的值开始其生命,该值不依赖于" last"调用func1(),编译器是否可以注意到并优化要存储在堆栈中的变量?

你一定是在问自己,为什么不要只使用局部变量。 您是正确的,但这是我工作中新C开发人员的一个常见错误,我想知道编译器是否可以优化此路径,因为您可以看到func1()的依赖图并且决定不应该那是有问题的。

3 个答案:

答案 0 :(得分:3)

修复工程师,而不是软件。

鉴于这个问题的性质,我不希望附加的唯一答案是与代码相关的修复(似乎是)更广泛的问题。

正如我在问题的评论中所提到的,我相信这是一个XY Problem;我的意思是,问题是询问如何优化特定解决方案,但应该询问如何最好地处理问题(尽管如此,这样的问题可能最终会被标记为基于意见或偏离主题,这引出了一个问题,即这是否是在SO上提问的正确方法,但这是一个切线)。

关于这一点,解决工程人员实施次优解决方案的问题不应该是尽可能优雅地处理这些次优实现。实际上只有两种方法可以解决这个问题:

  • 细化:教育您的工程师。教他们为什么他们的实现是次优的,以及更优化的方法。
  • 替换:与实施最佳解决方案的工程师实施次优解决方案的替代工程师。

显然,尝试教育应该是这里的第一步。在大多数公司中,这将存在于表单代码审查中,允许讨论潜在的陷阱,并在更好的方法上进行协作。但是有很多技术可以在这里应用,而且需要找到对你的团队最有效的结果。

答案 1 :(得分:2)

不仅如此,gcc将完全消除变量。 https://godbolt.org/g/x947ck

.LC0:
  .string "my_var = %d\n"
func1():
  mov esi, 2
  mov edi, OFFSET FLAT:.LC0
  xor eax, eax
  jmp printf

注意它是如何计算出my_var总是2,并且根本没有为变量分配内存。

答案 2 :(得分:-3)

  

编译器可以注意到并优化要存储在堆栈中的变量吗?

没有

这样做会违反C标准的语义要求。没有办法告诉编译器值的重写不应该影响对变量的其他独立访问。因此,删除函数调用的副作用将违反C标准。

如果想要函数的局部变量,请使用函数的局部变量。你正在尝试使用"木匠"谁也不知道木材是什么。