在循环范围之外声明参数是否更有效?

时间:2012-06-15 11:09:51

标签: c++ optimization scope declaration

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

这样的事情:

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循环中变量的范围限制可能会阻止它们在循环外被访问,因为循环的内容存在于同一堆栈框架内,“实际”声明只发生一次。 / p>

(注意,我考虑过Creating an object in the loop,但认为这是一个不同的问题,因为它涉及与声明而非初始化相关的任何费用。)

编辑 - 改进标题

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

没有一般答案。它取决于B的类型,编译器 你正在使用,也可能是你在循环中所做的事情 分配)。你所能做的只是衡量,甚至只能说明 关于在一台特定机器上运行的特定编译器。