加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C 11中循环中函数返回值的内存分配:它如何优化?

发布时间:2020-12-16 09:50:17 所属栏目:百科 来源:网络整理
导读:我有一些过早优化的心情,并想知道以下情况. 如果有一个for循环,并且在该循环内部有一个函数的调用,该函数返回一个容器,比如一个向量,其值使用移动语义作为rvalue捕获到循环中的变量中,例如: std::vectorany_type function(int i){ std::vectorany_type outp
我有一些过早优化的心情,并想知道以下情况.

如果有一个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的实现感兴趣,但也想知道英特尔编译器的用途.

解决方法

I would imagine that the most efficient thing to do is to allocate a
single piece of memory for all the values,both inside the function
and outside in the for-loop,that will get overwritten in each
iteration.

我不认为任何当前的编译器都能做到这一点. (我会惊讶地看到.)如果你想获得见解,请观看Chandler Carruth’s talk.

如果需要这种优化,则需要自己完成:在循环外部分配向量,并通过非const引用传递给function()作为参数.当然,不要忘记在完成后调用clear()或在函数()内调用clear().

所有这些与移动语义无关,在这方面C 11没有任何改变.

如果你的循环是一个繁忙的循环,那么在每次迭代中分配一个容器会花费你很多.在这种情况下找到自己比你想象的更容易. Andrei Alexandrescu在他的演讲Writing Quick Code in C++,Quickly中提供了一个例子.令人惊讶的是,在一个紧凑的循环中进行不必要的堆分配(如他的示例中的那个)可能比实际的文件IO慢.我很惊讶地看到了这一点.顺便说一下,容器是std :: string.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读