return obj(value);
返回什么?返回它是新构造的对象还是它的副本?
我之所以问: 是
return obj(value);
比
更有效率temp = obj(value);
return temp;
跟进:如果是这样,它真的有区别,还是编译器优化了它?
答案 0 :(得分:2)
返回语句总是返回参数对象的副本,但有一个例外:当函数返回引用时,引用可能会附加到{{1}的参数直接,在这种情况下,当然没有复制。
出于这个原因,从您的案例的迂腐角度来看,没有办法说明会发生什么,因为我们不知道使用return
的函数的签名。它是否返回引用?
如果我们假设函数返回一个非引用类型(这可能是你暗示的那个),那么,在这两种情况下都会返回一个副本。在第二种情况下,您还可以在return
对象中创建一个额外的副本。因此,从抽象的角度来看,第二个变体会产生一个额外的副本,因此“慢”。但是,C ++语言允许在这种情况下进行相当深远的优化。阅读有关RVO(返回值优化)和NRVO(命名返回值优化)的信息。由于这些优化,实际上两个变体实际上可能会生成相同的代码,显然,它们同样有效。
最后,它归结为您的特定编译器将能够生成的代码。如果您想知道哪个更快,请使用特定的编译器和特定的编译器设置。或者检查生成的机器代码。
答案 1 :(得分:0)
效率不高。它将新创建的值作为副本返回。但在这两种情况下,编译器都可能优化返回值。
答案 2 :(得分:0)
什么是返回obj(值);返回? 的
对象
返回新构造的对象或其副本吗?
取决于编译器。
比
更有效率没有
但是,一旦我们向编译器添加优化,故事就会改变。 NRVO和RVO是不同的优化。编译器可以应用一个而不是另一个。