我想进行一些过早的优化,并想知道以下内容。
如果有一个for循环,循环内部调用一个返回容器(如vector)的函数,并将其作为rvalue使用move语义捕获到循环中的变量中,例如:
std::vector<any_type> function(int i)
{
std::vector<any_type> output(3);
output[0] = i;
output[1] = i*2;
output[2] = i-3;
return(output);
}
int main()
{
for (int i = 0; i < 10; ++i)
{
// stuff
auto value = function(i);
// do stuff with value ...
// ... but in such a way that it can be discarded in the next iteration
}
}
如果应用移动语义(且函数不会被内联),编译器在内存方面如何处理?我想最有效的做法是为所有值分配单个内存块,包括函数内部和for循环外部的值,在每次迭代中都会被覆盖。
我主要关心这个问题,因为在我的实际应用程序中,我创建的向量比这里给出的示例要大得多。我担心如果我使用这样的函数,分配和销毁过程将占用大量无用的时间,因为我已经知道我将多次使用该固定数量的内存。所以,我实际上正在询问是否有一些方式可以优化编译器以实现以下形式:
void function(int i, std::vector<any_type> &output)
{
// fill output
}
int main()
{
std::vector<any_type> dummy; // allocate memory only once
for (int i = 0; i < 10; ++i)
{
// stuff
function(i, dummy);
// do stuff with dummy
}
}
我特别关注的是GCC实现,但也想知道例如Intel编译器的做法。
-S
选项告诉它生成汇编代码而不是目标/可执行文件,然后检查生成的汇编代码以了解其功能。 - Some programmer dude