这似乎是一个简单的问题,但是,在任何脚本语言中重用变量通常是一个好主意吗?
我特别感兴趣的是它为什么不是好习惯的原因,因为如果我应该或不应该这样做,我就是我自己。
例如,$i
是循环中用于迭代事物的最常见变量之一。
E.g(在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
当然这是最简单的使用示例,我想知道脚本是否非常复杂,是否会造成比它值得更多的麻烦?
我知道重新使用变量可以节省少量内存但是当这些变量堆积起来时,它变得很重要,不是吗?
感谢你提前做出任何直接答案,如果这个问题太模糊,我道歉并想知道这一点 - 所以我知道我应该在其他地方提出这些问题。
答案 0 :(得分:2)
我认为你的“字符串”与“变量”混淆了。字符串是ASCII或Unicode字符的集合,具体取决于编程语言。变量是内存中的命名位置。所以你在谈论回收变量,而不是字符串。
不幸的是,处理变量的方式是高度语言和编译器特定的。如果您向我们提供更多详细信息,您将获得更好的信息。
大多数语言都具有范围的概念,可变空间在声明处分配,并在范围结束时解除分配。如果将变量保持在适当的范围内,则不必担心浪费内存,因为变量将在不再需要时被释放。同样,范围的细节依赖于语言。
通常,重复使用这样的变量名称是一个坏主意,因为当你忘记将变量重置为同一范围内的某个初始值时,你的程序将在运行时中断。
答案 1 :(得分:2)
在进入foreach循环之前,您应该将$i
初始化为0,无论您是否在函数中使用过它,而且无论您使用何种语言。它只是一种语言中立的最佳实践。
许多语言通过允许您将计数变量绑定到for循环的范围来帮助您强制执行此操作。 PHP的foreach
提供了类似的机制,前提是您的数组基于0并且只包含数字键:
foreach ($array as $i => $v) {
echo $v;
if ($i + 1 < count($array))
echo ', ';
}
另外,关于你的陈述:
我知道重新使用变量可以节省少量内存但是当这些变量堆积起来时,它变得很重要,不是吗?
不,它确实没有。当变量超出范围时,变量将被垃圾收集。几乎不可能(没有编程生成代码)在单个函数的过程中使用如此多的计数/临时变量,而内存使用非常重要。重用变量而不是声明新变量将对程序性能没有可测量的影响,并且几乎不会影响其内存占用。
答案 2 :(得分:1)
重置变量($ i = 0)不会占用更多空间。
当您声明一个变量(比如整数类型)时,会为该整数分配预定义的内存量,而不管其值是多少。通过将其更改回零,您只需修改该值。
如果声明一个新变量,则必须为其分配内存,并且通常它也会初始化为零,因此重置现有变量可能也不占用任何额外的CPU时间。
重复使用索引变量进行互斥循环是一个好主意;它使您的代码更容易理解。如果你宣布了很多额外的变量,那么阅读你的代码的其他人可能会怀疑即使你的循环完成后“i”仍然被用于某些东西。
重复使用! :)
答案 3 :(得分:1)
就个人而言,重复使用索引/计数器变量没有任何问题 - 尽管在某些语言中,例如.Net,在for循环中使用变量专门将变量范围限定为该循环 - 因此无论如何都会在之后清理它。
您不应该重复使用包含任何重要数据的变量(这不应该是一个问题,因为所有变量都应该有描述性名称)
我曾经不得不尝试清理学生写的一些excel宏代码 - 所有变量名都是希腊神,并且在整个脚本中反复交换使用。最后,我只是重写了它。
您还应该知道,根据变量的类型和您使用的语言,重新分配内容可能与创建新变量一样昂贵。例如,在.Net中,字符串是不可变的,所以这......
Dim MyString as String = "Something"
MyString = "SomethingElse"
实际上会分配一个新的内存区域来存储第二次使用,并将MyString
指针更改为指向新位置。
顺便说一下,这就是为什么以下内容效率非常低(至少在.Net中):
Dim SomeString = SomeVariable & " " & SomeOtherVariable
为SomeVariable
分配内存,为SomeVariable + " "
分配更多内存,然后再为SomeVariable + " " + SomeOtherVariable
分配内存 - 意味着SomeVariable
实际上已写入内存3次。
总之,我重复使用的循环的非常简单的变量。还有别的,我只是分配一个新的变量 - 特别是因为内存分配通常只是大多数应用程序的时间/处理的一小部分。
答案 4 :(得分:1)
这取决于您正在解决的问题。
使用PHP(和其他脚本语言)时,应考虑对大型变量(如数组或长字符串)进行unset()。你不应该费心去重复使用或取消设置小变量(整数/布尔/等)。使用(慢)脚本语言时,这是不值得的。
如果您正在使用低级(低级)语言(如C语言)开发性能关键型应用程序,则可变重用更为重要。