【发布时间】:2011-03-27 07:48:46
【问题描述】:
我最近在 comp.lang.c++ 上看到了一段代码,它从函数中返回了一个静态整数的引用。代码是这样的
int& f()
{
static int x;
x++;
return x;
}
int main()
{
f()+=1; //A
f()=f()+1; //B
std::cout<<f();
}
当我使用我很酷的 Visual Studio 调试器调试应用程序时,我只看到一个对语句 A 的调用,我猜我很震惊。我一直认为i+=1 等于i=i+1 所以
f()+=1 将等于 f()=f()+1,我会看到两个对 f() 的调用,但我只看到一个。这是什么鬼?是我疯了,还是我的调试器疯了,或者这是过早优化的结果?
【问题讨论】:
-
static int x未初始化。 -
不过,这与问题无关。
-
@Rambo:我想你在谈论这个话题:groups.google.com/group/comp.lang.c++.moderated/browse_thread/…
-
@Kirill:如果您不指定其他值,静态变量将被初始化为零。实际上,如果您想获得技术知识,无论如何它们都是零初始化的,并且只有在您指定之后才初始化为其他值(同一变量可以合法地初始化两次为两个不同值的罕见地方之一。
-
就术语而言,“过早优化”必然是判断错误,并且仅适用于程序员所做的优化(试图优化对程序速度没有显着影响的东西,并使东西不可读或在此过程中更难维护)。编译器的优化对源代码没有影响,因此要么正确要么不正确(一个错误)。
标签: c++ reference premature-optimization