C 11中循环中函数返回值的内存分配:它如何优化?
我有一些过早优化的心情,并想知道以下情况.
如果有一个for循环,并且在该循环内部有一个函数的调用,该函数返回一个容器,比如一个向量,其值使用移动语义作为rvalue捕获到循环中的变量中,例如: 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的实现感兴趣,但也想知道英特尔编译器的用途. 解决方法
我不认为任何当前的编译器都能做到这一点. (我会惊讶地看到.)如果你想获得见解,请观看Chandler Carruth’s talk. 如果需要这种优化,则需要自己完成:在循环外部分配向量,并通过非const引用传递给function()作为参数.当然,不要忘记在完成后调用clear()或在函数()内调用clear(). 所有这些与移动语义无关,在这方面C 11没有任何改变. 如果你的循环是一个繁忙的循环,那么在每次迭代中分配一个容器会花费你很多.在这种情况下找到自己比你想象的更容易. Andrei Alexandrescu在他的演讲Writing Quick Code in C++,Quickly中提供了一个例子.令人惊讶的是,在一个紧凑的循环中进行不必要的堆分配(如他的示例中的那个)可能比实际的文件IO慢.我很惊讶地看到了这一点.顺便说一下,容器是std :: string. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |