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

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

例如, $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 或仅使用其他变量,例如 $a 对于任何其他循环 $b$z.

显然要重复使用 $i, ,我必须设置 $i=0; 或者 null 在循环之前,否则将在脚本中提供一些非常奇怪的行为。这让我想知道重复使用是否值得麻烦。

以下占用的空间不仅仅是使用另一个变量吗?

$i=0;    //Recycling $i

当然,这是最简单的使用示例,我想知道该脚本是否更加复杂,会造成比价值更多的麻烦吗?

我知道重复使用变量可以节省小数量的内存,但是当这些变量堆叠起来时,它很重要,不是吗?

感谢您提前的任何直接答案,如果这个问题太模糊了,我深表歉意,也想知道这一点 - 我知道我应该在其他地方提出这样的问题。

有帮助吗?

解决方案

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

当您声明变量(例如类型整数)时,无论其值是多少,都会为该整数分配预定量的内存。通过将其更改回零,您只需修改值即可。

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

重复使用互斥循环的索引变量是一个好主意。它使您的代码更容易理解。如果您宣布很多额外的变量,那么其他阅读代码的人可能会怀疑即使在循环完成后,“我”是否仍在用于某些东西。

重复使用! :)

其他提示

我认为您的“字符串”与“变量”相混淆。字符串是ASCII或Unicode字符的集合,具体取决于编程语言。变量是内存中的命名位置。因此,您是在谈论回收变量,而不是字符串。

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

大多数语言都有范围的概念,在声明时分配了可变空间,并在范围结束时进行了处理。如果您将变量保持在适当的范围中,则不必担心浪费内存,因为在不再需要时会处理变量。同样,范围的细节取决于语言。

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

您应该初始化 $i 到0进入foreach循环之前,无论您是否在功能中是否较早使用它,无论您使用的语言如何。这是一种不中立语言的最佳实践。

许多语言通过允许您将计数变量绑定到for循环的范围来帮助您实施此功能。 PHP的 foreach 提供类似的机制,前提是您的数组为0,并且仅包含数字键:

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

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

另外,关于您的声明:

我知道重复使用变量可以节省小数量的内存,但是当这些变量堆叠起来时,它很重要,不是吗?

不,真的没有。当变量掉落范围时,它们将被垃圾收集。在单个函数过程中,几乎不可能(如果没有程序生成代码)使用如此多的计数/临时变量,以至于内存使用量至关重要。重复使用变量而不是声明新变量不会对您的程序性能产生可衡量的影响,并且几乎不会影响其内存足迹。

我个人在重复使用索引/计数器变量时没有任何问题 - 尽管在某些语言中,例如,使用for for for for loop中的变量专门将变量示为该循环 - 因此,无论如何它都会清理。

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

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

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

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

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

顺便说一句,这就是为什么以下效率确实效率低下的原因(至少在.net中):

Dim SomeString = SomeVariable & " " & SomeOtherVariable

这为内存分配 SomeVariable 然后更多的内存 SomeVariable + " ", ,然后再次 SomeVariable + " " + SomeOtherVariable - 意义 SomeVariable 实际上是写给记忆3次的。

总而言之,我会重复使用的非常简单的循环变量。其他任何东西,我都只会分配一个新变量 - 尤其是因为内存分配通常只是大多数应用程序的时间/处理的一小部分。

记住: 过早优化是所有邪恶的根源

这取决于您解决的问题。

使用PHP(和其他脚本语言)时,您应该考虑在较大的变量(例如数组或长字符串)上进行UNSET()。您不应该费心重复使用或不设置小变量(整数/boolean/etc)。当使用(慢)脚本语言时,这只是不值得的。

如果您正在以低(较低)级别的语言(例如C)(例如C)开发性能关键应用程序,那么可变重复使用更为重要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top