当前位置: 首页 > 知识库问答 >
问题:

之前声明所有局部变量是否有性能增益或其他原因?

丁经略
2023-03-14

我在我们的代码库和在线中也经常看到这种风格,如果有一个带有for循环和if语句的函数,那么所有只有它们使用的变量,除此之外没有任何其他变量被声明。例如:

void process()
{
    int i;
    int count = 100;
    vector3 point;
    vector sum;

    for (i = 0; i < count; ++i)
    {
        import(this, "pos", point);
        sum += point;
    }
    sum /= count;
}

或者这是过早的优化?我对C、C#和Python很好奇,它们是我使用的语言,也是我反复看到它们的地方。

共有3个答案

楚嘉胜
2023-03-14

这没什么区别。不管怎样,它都在堆栈上。

许鸿志
2023-03-14

这在python中有所不同。这是一个范围问题,python将首先搜索包含局部变量的字典,然后向上搜索全局变量和内置变量。

在python中,这方面的速度略有提高,尽管通常不会有很大提高。检查此问题以查看python的更多详细信息,包括一些测试。

我不能评论C或C#,但是因为它们是编译语言,所以不应该有什么关系。

乐修远
2023-03-14

很多旧代码都这样做,因为C89/90中需要它。好的,从技术上讲,从来没有要求在函数的开头定义变量,只是在一个块的开头。例如:

int f() { 
    int x;   // allowed

    x = 1;
    int y;   // allowed in C++, but not C89

    {
       int z=0;    // beginning of new block, so allowed even in C89

       // code that uses `z` here
    }
}

C从来没有这种限制(C也有很长一段时间没有了),但是对于一些旧习惯来说很难改掉。对其他人来说,在代码库中保持一致性比在使用变量的地方定义变量的好处更重要。

就优化而言,所有这些通常都不会产生任何效果。

 类似资料:
  • 局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性. 例子 13.2 . 使用局部变量 def dest = "dest" task copy(type: Copy) { form "source" into dest }

  • 问题内容: 我在文件中有一系列Python类。一些类引用其他类。 我的代码是这样的: 尝试运行它,我得到了。足够公平,但是有什么方法可以使它起作用,还是我必须手动重新排列我的课程才能容纳?在C ++中,我可以创建一个类原型。Python是否具有等效功能? (我实际上是在玩Django模型,但是我没有尝试使事情复杂化)。 问题答案: 在Python中,您本身并不会创建原型,但是您需要了解“类属性”和

  • 问题内容: 所以这很奇怪,我知道代码本身是没有用的,但是我想知道为什么会收到错误: 我正在写一些代码,我已经写了这个: 当时没有考虑可变范围,显然这是没有用的,因为无论如何我都无法使用过去。我没有得到的是为什么我得到了我的错误: 现在,如果我将其修改为: 它将编译正常。我给人的印象是,如果大括号下有1行是可选的……显然,还有其他考虑,或者两者都会编译或失败。 有人可以向我解释一下,还是可以指向一个

  • gcc是否有一个选项来禁用未显式定义为volatile的全局变量的读/写优化? 我的团队正在耗尽我们的嵌入式C项目的程序内存,该项目使用gcc构建。当我启用优化以减少代码大小时,代码不再像预期的那样工作,因为我们没有在我们应该使用的地方使用volatile关键字。也就是说,我能够通过声明在ISRs Volatile中访问的几个变量来解决呈现的问题。然而,我并不确定这些是我需要声明volatile的

  • 问题内容: 明智与否?编译器会始终优化if语句吗?是否有任何可从if语句中受益的用例? 如果是可变变量怎么办? 我对C ++和Java答案都感兴趣,因为volatile变量在两种语言中都有不同的语义。Java的JIT编译也可以有所作为。 如果我们总是用X覆盖var,则if语句会引入分支和附加读取,这是不可能的,所以这很不好。另一方面,如果随后使用此优化,则仅执行读取操作,而不执行写入操作,这可能会

  • 问题内容: 我正在寻找类似于ThreadLocal的类,该类将在线程组而不是线程上工作。 如果没有这样的类(在某些开源库中),您将如何实现它?比在WeakHashMap中拥有线程组更好的主意? 我正在使用全局,每个线程和每个线程组上下文中的各种参数在运行时实现可调试的调试框架。作为一个非常简单的示例,您可以有一个报告语句: 并指定只有当服务网络请求的线程组中的某个线程调用该线程时,才会显示具有该特