【问题标题】:Does declaring the same variable cost me resources?声明相同的变量会花费我的资源吗?
【发布时间】:2021-07-15 21:54:15
【问题描述】:

我不确定如何提出这个问题,所以我试着用这种方式来描述它...... 会这样吗:

#include <iostream>

int main()
{
  int i;
  while (true)
    for (i = 0; i < 100; i++)
      std::cout << i << '\n';

  return 0;
}

跑得比这还快?:

#include <iostream>

int main()
{
  while (true)
    for (int i = 0; i < 100; i++)
      std::cout << i << '\n';

  return 0;
}

也许问题可以这样形成:声明一个变量(不初始化它)会消耗我的资源吗?

【问题讨论】:

  • 没有。声明一个变量(非类类型)本身不会消耗任何资源,至少在启用优化的情况下(关心禁用操作的资源是没有意义的)。以后使用该变量的操作可能会消耗一些资源,如果它们有助于在假设条件下的可观察行为。
  • 请比较godbolt.org/z/j8dr5hsz1godbolt.org/z/T1YfT63sW,这将向您展示代码是如何在各种架构和编译器上编译的。
  • 使用无限循环来问效率问题很奇怪。
  • 无限循环应该很容易表示 int i 被多次声明的事实

标签: c++ variable-declaration


【解决方案1】:

同意前面的回答。我认为没有本质区别。在这两种情况下,变量都将被分配到堆栈中。差异只是在可见性的可变区域中 - 对性能并不重要。

【讨论】:

  • “在这两种情况下,变量都将被分配到堆栈中。”——这是错误的。启用优化后,变量值将映射到寄存器。比如这里:godbolt.org/z/a5969xbc3ebx
  • 您同意这一事实无需提供额外答案。只需对已有答案添加评论即可。
  • @DanielLangr 你是对的,同时又不是对的。这取决于当前的编译器和平台。您不能确定该变量是在注册表中还是在堆栈中。所以是的,我对“堆栈”的看法不太准确。 czarson 只为我们提供了一个示例代码。假设他分析了一些性能问题。祝他好运:)
  • @HaronDDC 通常是的,但是没有理智的编译器会在启用优化的堆栈上存储循环索引。
【解决方案2】:

不,除非您在禁用优化的情况下进行编译,在这种情况下,对“资源”的担忧很奇怪。

后者更清晰,出错的可能性更小(由于变量范围更小),所以使用它。

声明一个变量(不初始化它)会消耗资源吗?

在存在优化编译器的情况下,这个问题通常毫无意义。例如,在您的循环中,在这两种情况下都可能不会为该变量分配“任何资源”。 不要陷入过早优化的陷阱。运行意图明确的代码(对您和编译器而言),您将获得良好的结果。

【讨论】:

  • 不清楚优化与此有关。
  • 例如,通过优化,编译器可能在两种情况下都使用i 的寄存器。没有它,如果它是在函数级别声明的,它可能不会。关键是,您不能真正推测禁用优化的资源消耗细节,因为编译器可能会非常愚蠢,以使调试更容易。例如,调试人员可能希望在for 循环完成后查看i 的值。
  • @SergeyA 无法回答上述问题。只要满足“好像”规则,编译器就可以进行任何转换。例如,编译器可以完全展开循环(与 100 计数不同,除非特别要求,但仍然如此),因此甚至不需要寄存器/堆栈空间来存储计数器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2021-10-12
  • 1970-01-01
  • 2016-02-18
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多