我在课堂上有很多重载的功能。在这种情况下,我应该将int32_t数据声明为类的成员变量,所以我不是在每个函数中反复声明它吗? Fill函数总是通过引用设置一个值,所以我认为我不应该每次都在每个函数中声明它。
这里没有列出更多这些功能:
void TransmitInfo(TypeA &dp, Id &tc)
{
//do lots of other work here
int32_t data;
while (dp.Fill(data)) //Fill accepts a reference variable, "data" gets populated
{
Transmit(tc, data);
}
}
void TransmitInfo(TypeB &dp, Id &tc)
{
//do lots of other work here
int32_t data;
while (dp.Fill(data))
{
Transmit(tc, data);
}
}
void TransmitInfo(TypeC &dp, Id &tc)
{
//do lots of other work here
int32_t data;
while (dp.Fill(data))
{
Transmit(tc, data);
}
}
答案 0 :(得分:5)
在选择声明变量的位置时,范围不是唯一要考虑的因素。同样重要的是变量的生命周期以及变量的创建时间。
当你在一个函数内部声明一个变量时,无论何时调用该函数都会创建它,如果需要则会多次(递归!)。当函数退出时它就被破坏了。 对于简单类型int32_t
,这些创建/破坏是CPU的noops。
在类中声明它时,每个创建的对象只能获得一个变量副本。如果你的一个函数调用另一个(或它自己),它们都将使用相同的变量。您还可以增加对象的大小;即使没有使用,你的变量也会占用内存。
因此,底线是:使用不同类型的变量来实现它们为设计的目的。
static
函数变量。static
类变量。其他任何事都会导致混乱。
答案 1 :(得分:2)
绝对不要这样做。如果它只是函数生命中的一个临时函数,那么请将其保留在本地。
否则,你会遇到比你解决的问题更多的问题;例如多线程和序列化。
将这种微观优化留给编译器。
答案 2 :(得分:2)
您应该避免对任何类型的临时数据使用成员变量。这样做的原因是它保证您的代码不是线程安全的,并且在这个并行计算的时代,这是一个主要的缺点。分配int32_t
的成本非常小,可以忽略不计,因此通常最好在函数内部进行分配以保持线程安全。在单个int
分配变得明显之前,您将需要分配超过一百万次,即使这样,总损失也将以微秒为单位。
如果您在优化时遇到这样的困难,那么您必须采用如此高度的微优化,那么您可能应该尝试重新编写算法以创建更好的缩放,而不是花费大量时间来优化某些内容。不是一个阻碍点。 (你也可以使用一个好的并发算法,而不是从串行算法中削减皮秒。)