首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中优化返回值时生成的等效代码

在c++中优化返回值时生成的等效代码
EN

Stack Overflow用户
提问于 2011-05-07 08:03:30
回答 3查看 95关注 0票数 1

我不能理解编译器是如何在幕后优化它的。也就是说,它生成的等价代码是什么?有一个在http://en.wikipedia.org/wiki/Return_value_optimization中提到的示例,它显示了优化前的代码:

代码语言:javascript
复制
struct Data { char bytes[16]; };

Data * f(Data * __hiddenAddress)
{
    Data result = {};
    // copy result into hidden object
    *__hiddenAddress = result;
    return __hiddenAddress;
}

int main()
{
    Data __hidden; // create hidden object
    Data d = *f(&__hidden); // copy the result into d
}

它没有说优化后的等效代码。

EN

回答 3

Stack Overflow用户

发布于 2011-05-07 08:10:35

好的,页面已经被证明不是很清晰,因为我在第一次扫描时读错了(哦)。下面列出了在优化之前的

代码语言:javascript
复制
struct Data { char bytes[16]; };
Data f()
{
  Data result = {};
  // generate result
  return result;
}

int main()
{
  Data d = f();
}

您列出的代码是未优化的伪版本,因为编译器可能会解释它,并完成临时和复制构造。它所展示的是编译器如何将返回值的函数转换为过程代码(返回值传递机制)。

在此之后,将列出优化后的代码:

代码语言:javascript
复制
struct Data { char bytes[16]; };

void f(Data * p)
{
  // generate result directly in *p
}

int main()
{
  Data d;
  f(&d);
}

即:允许编译器直接在返回值的目标上工作,绕过函数体内临时实例的构造/销毁/复制。

票数 3
EN

Stack Overflow用户

发布于 2011-05-07 08:15:52

代码语言:javascript
复制
struct Data { char bytes[16]; };

void f(Data * useThisInsteadOfReturning)
{ 
   // update *useThisInsteadOfReturning directly
}

int main()
{
  Data d;
  f(&d); // use d in the function
}
票数 1
EN

Stack Overflow用户

发布于 2011-05-07 08:21:01

优化后的代码显示在您提到的代码下面。引用维基百科网站的话:

代码语言:javascript
复制
struct Data { char bytes[16]; };

void f(Data * p)
{
   // generate result directly in *p
}

int main()
{
   Data d;
   f(&d);
}

因此,编译器可以确定它保留了内存来保存函数的返回值,并将其视为指向该内存的指针已作为参数传递,然后直接写入内存,而不是在函数内部创建另一个临时对象,然后复制内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5918191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档