Tim*_* MB 4 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.
}
Run Code Online (Sandbox Code Playgroud)
变成了这个:
A arr[BIG_NUMBER];
// .... //
B b;
for (int i=0; i!=BIG_NUMBER; ++i)
{
b = arr[i].getB();
// ... do some work with b.
}
Run Code Online (Sandbox Code Playgroud)
据推测,我们可以节省不断的重新定标b
.但这是否合理呢?根据B是原始类型还是类,答案是否有所不同?
我原以为虽然for循环中变量的范围限制可能会阻止它们在循环外被访问,因为循环的内容存在于同一堆栈帧中,"实际"声明只发生一次.
(注意,我考虑在循环中创建一个对象,但认为这是一个不同的问题,因为它与声明而不是初始化相关的任何成本.)
编辑 - 改进标题
如果它是原始类型,编译器将相应地进行优化.
如果它是用户定义的类,则取决于它.什么更昂贵,一个额外的初始化或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
Run Code Online (Sandbox Code Playgroud)