3

这似乎是一个简单的问题,但是,在任何脚本语言中重用变量通常是个好主意吗?

我对为什么它是/不是好习惯的原因特别感兴趣,因为我除了我自己之外,如果我应该或不应该这样做。

例如,$i是循环中用于迭代事物的最常见变量之一。

例如(在 php 中):

//This script will iterate each entry in $array 
//and output it with a comma if it isn't the last item.

$i=0;    //Recycling $i

foreach ($array as $v) {
    $i++;

    if ($i<count($array))
    {
        echo $v.', ';
    }
    else {
        echo $v;
    }
}

假设我的脚本中有几个循环,最好是重用$i还是只使用另一个变量,例如$aand 对于任何其他循环从$bto $z.

显然要重用$i,我必须在循环之前设置$i=0;or null,否则稍后会在脚本中产生一些非常奇怪的行为。这让我想知道重复使用它是否值得麻烦..

以下内容会比仅使用另一个变量占用更多空间吗?

$i=0;    //Recycling $i

当然这是最简单的使用示例,我想知道如果脚本非常复杂,它会带来更多的麻烦吗?

我知道重用一个变量可以节省少量的内存,但是当这些变量堆积起来时,它变得很重要,不是吗?

感谢您提前提供任何直接的答案,如果这个问题太模糊,我很抱歉并且也想知道这一点 - 这样我就知道我应该在其他地方问这样的问题。

4

5 回答 5

2

我认为您将“字符串”与“变量”混淆了。字符串是 ASCII 或 Unicode 字符的集合,具体取决于编程语言。变量是内存中的命名位置。所以你说的是回收一个变量,而不是一个字符串。

不幸的是,处理变量的方式是高度特定于语言和编译器的。如果您向我们提供更多详细信息,您将获得更好的信息。

大多数语言都有范围的概念,变量空间在声明时分配,在范围结束时释放。如果将变量保留在适当的范围内,则不必担心浪费内存,因为不再需要时将释放变量。同样,范围的细节取决于语言。

通常,像这样重用变量名称是一个坏主意,因为当(不是如果)您忘记将变量重置为同一范围内的某个初始值时,您的程序将在运行时中断。

于 2010-11-15T19:00:11.510 回答
2

您应该$i在进入 foreach 循环之前初始化为 0,无论您是否在函数的早期使用过它,也无论您使用的是什么语言。这很简单,是一种语言中立的最佳实践。

许多语言通过允许您将计数变量绑定到 for 循环的范围来帮助您执行此操作。PHPforeach提供了类似的机制,前提是您的数组是从 0 开始的并且只包含数字键:

foreach ($array as $i => $v) {
    echo $v;

    if ($i + 1 < count($array))
        echo ', ';
}

另外,关于你的陈述:

我知道重用一个变量可以节省少量的内存,但是当这些变量堆积起来时,它变得很重要,不是吗?

不,真的没有。当变量超出范围时,它们将被垃圾收集。在单个函数的过程中使用如此多的计数/临时变量几乎是不可能的(没有以编程方式生成代码),以至于内存使用量非常重要。重用一个变量而不是声明一个新变量不会对你的程序性能产生可衡量的影响,而且几乎不会影响它的内存占用。

于 2010-11-15T19:02:31.750 回答
1

重置变量 ($i=0) 不会占用更多空间。

当你声明一个变量(比如整数类型)时,无论它的值是什么,都会为该整数分配预定义的内存量。通过将其更改回零,您只需修改该值。

如果您声明一个新变量,则必须为其分配内存,并且通常它也将初始化为零,因此重置现有变量可能也不会占用任何额外的 CPU 时间。

为互斥循环重用索引变量是个好主意;它使您的代码更容易理解。如果您声明了很多额外的变量,其他阅读您的代码的人可能会想知道即使在您的循环完成之后,“i”是否仍被用于某些事情。

重复使用它!:)

于 2010-11-15T19:08:23.153 回答
1

就我个人而言,我对重用索引/计数器变量没有任何问题——尽管在某些语言(例如 .Net)中,在 for 循环中使用变量专门将变量范围限定为该循环——所以无论如何它都会在之后被清理掉。

你不应该重复使用包含任何重要数据的变量(这不应该是一个问题,因为你的所有变量都应该有描述性的名称)

我曾经不得不尝试清理一个学生编写的一些 excel 宏代码 - 所有变量名称都是希腊神,并且在整个脚本中反复交换了用法。最后,我只是重写了它。

您还应该知道,根据变量的类型和您使用的语言,重新分配内容可能与创建新变量一样昂贵。例如,再次在.Net 中,字符串是不可变的,所以这...

Dim MyString as String = "Something"
MyString = "SomethingElse"

实际上将分配一个新的内存区域来存储第二次使用并更改MyString指针以指向新位置。

顺便说一句,这就是为什么以下内容确实效率低下(至少在.Net中):

Dim SomeString = SomeVariable & " " & SomeOtherVariable

这会为 分配SomeVariable更多内存SomeVariable + " ",然后再为SomeVariable + " " + SomeOtherVariable-分配SomeVariable内存 3 次。

总之,我会重复使用非常简单的循环变量。别的什么,我只是分配一个新的变量 - 特别是因为内存分配通常只是大多数应用程序时间/处理的一小部分。

记住:过早的优化是万恶之源

于 2010-11-15T19:37:55.023 回答
1

这取决于您要解决的问题。

在使用 PHP(和其他脚本语言)时,您应该考虑对相当大的变量(例如数组或长字符串)使用 unset()。您不必费心重复使用或取消设置小变量(整数/布尔值/等)。使用(慢)脚本语言时,这是不值得的。

如果您正在使用 C 等低级(较低)级语言开发性能关键型应用程序,那么变量重用更为重要。

于 2010-11-15T20:03:19.680 回答