4

有时在查看优化代码时,我看到仅在循环范围内使用的参数将其声明移到循环之外。

像这样的东西:

A arr[BIG_NUMBER];

// .... //

for (int i=0; i!=BIG_NUMBER; ++i)
{
    B b = arr[i].getB();
    // ... do some work with b.
}

变成这样:

A arr[BIG_NUMBER];

// .... //

B b;
for (int i=0; i!=BIG_NUMBER; ++i)
{
    b = arr[i].getB();
    // ... do some work with b.
}

据推测,原因是我们在不断地重新声明b. 但这是合理的做法吗?答案是否取决于 B 是原始类型还是类?

我会认为,虽然 for 循环内变量的范围限制可能会阻止它们在循环外被访问,因为循环的内容存在于同一个堆栈帧中,但“实际”声明只发生一次。

(注意,我考虑过在循环中创建一个对象,但认为这是一个不同的问题,因为它涉及与声明相关的任何成本,而不是初始化。)

编辑 - 改进的标题

4

2 回答 2

8

如果它是原始类型,编译器将相应地进行优化。

如果它是用户定义的类,则取决于。什么更昂贵,一个额外的初始化或BIG_NUMBER析构函数?

比较这些:

B b;  //one initialization
for (int i=0; i!=BIG_NUMBER; ++i)
{
    b = arr[i].getB();  //BIG_NUMBER assignments
}

for (int i=0; i!=BIG_NUMBER; ++i)
{
    B b = arr[i].getB();  //BIG_NUMBER initializations 
                          //should be the same as an assignment
} //BIG_NUMBER objects destroyed
于 2012-06-15T11:12:27.797 回答
1

没有一般的答案。这取决于 B 的类型、您使用的编译器,以及您在循环中(在分配之后)所做的事情。你所能做的就是测量,即使这样也只会告诉你一个特定的编译器,在一台特定的机器上运行。

于 2012-06-15T14:40:11.563 回答