C 静态全局变量可以优化到堆栈中吗?

C 静态全局变量可以优化到堆栈中吗?,c,optimization,C,Optimization,假设我正在C文件中声明一个静态全局变量: static int my_var = 0; 并仅在该文件中的一个函数中使用它: static void func1(void) { my_var = 1; my_var++; printf("my_var = %d\n", my_var); } 这里重要的是,my_var被一个值改写了(在本例中为1,但可以是一个函数或一个计算)。 假设my_var总是在func1()中以一个预先确定的值开始其生命周期,该值不依赖于对func

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

static int my_var = 0;
并仅在该文件中的一个函数中使用它:

static void func1(void)
{
    my_var = 1;
    my_var++;
    printf("my_var = %d\n", my_var);
}
这里重要的是,
my_var
被一个值改写了(在本例中为1,但可以是一个函数或一个计算)。 假设
my_var
总是在
func1()
中以一个预先确定的值开始其生命周期,该值不依赖于对
func1()
的“最后”调用,编译器能否注意到这一点并优化要存储在堆栈中的变量

你一定在问自己,为什么我不使用局部变量呢。
您的提问是正确的,但这是我工作中的新C开发人员经常犯的错误,我想知道编译器是否可以优化这一路径,正如您可以看到的
my_var
的依赖关系图一样,这个决定不应该有那么大的问题。

不仅如此,gcc还将完全消除该变量


请注意它是如何计算出
my_var
始终为2,并且根本不为变量分配内存的

不仅如此,gcc还将完全消除该变量

请注意它是如何计算出
my_var
始终为2,并且根本不为变量分配内存的

编译器能否注意到并优化要存储在堆栈中的变量

没有

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

如果想要函数的局部变量,请使用函数的局部变量。你想用不知道木头是什么的“木匠”来建造房子

编译器能否注意到并优化要存储在堆栈中的变量

没有

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


如果想要函数的局部变量,请使用函数的局部变量。你试图用不知道木头是什么的“木匠”建造房子。

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

考虑到这个问题的性质,我不希望它附带的唯一答案是针对(似乎是)更广泛问题的代码相关修复

正如我在问题的评论中所提到的,我认为这是一个错误;我的意思是,问题是问如何优化特定的解决方案,但应该问如何最好地处理问题(尽管如此,这样的问题最终可能会被标记为基于观点或脱离主题,这就引出了这样一个问题,即这是否真的是提出问题的正确方式,但这是一个切线)

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

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

显然,尝试教育应该是这方面的第一步。在现在的大多数公司中,这将以代码审查的形式存在,允许讨论潜在的陷阱,并就更好的解决方法进行协作。但这里有许多技术可以应用,问题是找到最有效的方法我会为您的团队提供结果。

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

考虑到这个问题的性质,我不希望它附带的唯一答案是针对(似乎是)更广泛问题的代码相关修复

正如我在问题的评论中提到的,我认为这是一个问题;我的意思是,问题是问如何优化特定的解决方案,但应该问如何最好地处理问题(尽管如此,这样的问题最终可能会被标记为基于观点或脱离主题,这就引出了这样一个问题,即这是否真的是提出问题的正确方式,但这是一个切线)

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

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

显然,尝试教育应该是这方面的第一步。在现在的大多数公司中,这将以代码审查的形式存在,允许讨论潜在的陷阱,并就更好的解决方法进行协作。但这里有许多技术可以应用,问题是找到最有效的方法我认为在这件事上,雇佣更好的开发人员应该是你关心的问题。或者引入代码审查流程,所以不是由工具链来处理这个问题。是的,这绝对是应用于软件工程管理的一个例子。管理层在哪里挖掘这样的代码员?我同意y你和我
.LC0:
  .string "my_var = %d\n"
func1():
  mov esi, 2
  mov edi, OFFSET FLAT:.LC0
  xor eax, eax
  jmp printf