问题标签 [rvo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
415 浏览

c++ - RVO with a standard layout struct without any constructors

I have a struct representing a binary message. I want to write a function to get the next such record from a buffer (whether a file or a socket, doesn't matter):

Now, I could write this like:

which is nice and gives me the benefits of RVO. However, it will invoke the default constructor of Record, which may be composed of types with non-trival default constructors which do work that I would like to avoid - these are not necessarily POD types, but they are standard layout.

Is there a way to write getNext() such that we avoid any constructors (default or copy/move) on Record? Ideally, when the user calls:

The buffer is read directly into the memory of record. Is this possible?

0 投票
1 回答
596 浏览

c++ - 具有复制省略或移动语义的 C++11 元组

我写了一个如下函数:

由于返回类型非常复杂,是否保证在 c++11 下编译器在构造结果时将应用复制省略或移动语义,或者我必须明确地说 std::move(std::make_tuple( std::move(p), 10, 10))?

0 投票
2 回答
282 浏览

c++ - 如何返回本地对象的成员

考虑以下代码:

getBigData()就复制省略/移动语义而言,实现的最佳方法是什么?在这个实现中,编译器似乎不允许移动bigData。我测试了以下功能:

你能解释一下这些实现的结果,并展示返回本地对象成员的最有效方法吗?

0 投票
1 回答
161 浏览

c++ - 由 value 返回的右值引用参数是 xvalue 吗?

我的理解是,在以下函数中,foo语句中的表达式return foo;是一个 xvalue,因为它表示的对象即将到期(即使foo在前面的语句中是一个左值):

哪些表达式会创建xvalues .

在以下情况下会改变吗?

return 语句中有foo一个 xvalue 吗?特别是,它是移动的候选者吗?而对于 RVO?还是应该使用一个return std::move(foo)

我不知道在foo第一种情况的 return 语句中将表达式分类为 xvalue 的正式规则是什么,所以我无法在第二种情况下对其进行测试。

0 投票
2 回答
285 浏览

c++ - RVO 是否与“新”一起使用?

在这种情况下会出现复制省略吗?换句话说,具有复制省略的现代编译器是否避免在这里调用任何复制构造函数?

我的目标是将对象存储在指针中。对象由函数返回。我想存储它而不复制它。

我不能使用 c++11

0 投票
1 回答
125 浏览

c++ - 在 C++ 中使用错误代码的更好方法是什么?

我是使用 c++11 的项目的成员。我不确定何时应该使用错误代码作为返回值。我发现即使直接返回字符串结构数据,C++ 中的 RVO 也能很好地工作。但是如果我使用返回码,我就无法获得 RVO 的好处,而且代码有点多余。

所以每次我声明函数时,我都无法决定应该使用哪个作为返回值。我应该如何保持代码的一致性?任何建议都会帮助我。

0 投票
1 回答
98 浏览

c++ - 避免 const-overload 和 RVO 的代码重复

为了在处理 const-overload 时避免代码重复,我写了这样的东西:

const_cast在非常量版本中使用,因为否则它将是 const 方法中的非常量函数调用,可能会修改对象并且会在不被注意的情况下逃脱(因为const_cast)。并且从非 const 到 const 的 const 转换不应该引起任何问题。

这里的问题是:因为我不能 const_cast 一个对象 -是否有可能因为调用lightCopy()返回 const 对象而实际返回类型不是 const - RVO 将不可能并且会制作额外的副本?

0 投票
2 回答
439 浏览

c++ - Lambda 表达式和 RVO

“返回值优化”的概念是否适用于 C++ 编译器中的 lambda 表达式?我知道这取决于编译器和优化参数,但理论上可能吗?

顺便说一句,有人知道 VS.NET 2013 或更高版本中的这个问题吗?

0 投票
1 回答
56 浏览

c++ - 当值被复制到现有对象时,(N)RVO 是否也会发生?

(N)RVO 有助于在将返回值分配给新变量时避免不必要的复制和创建临时对象(从而避免复制构造函数)。

所以像这样的事情应该由 RVO 优化:

但是,调用站点对象已经存在时也会发生这种情况吗?(即在使用=运算符而不是复制构造函数的情况下)。我试图找到有关此的文献,但 (N)RVO 似乎总是被描述为避免使用复制构造函数。不确定在这种情况下修改调用站点对象是否真的安全。

0 投票
1 回答
1407 浏览

c++ - 禁用一个函数的返回值优化

  • foo() 在汇编器中实现 (i386)
  • X 类型的返回值的地址作为隐藏参数传递给 foo()

  • 如果使用 -O0 编译测试代码,则代码按预期工作

  • 如果使用 -O3 编译发生分段错误(返回值已优化)
  • 如果使用 -O3 -fno-elide-constructors 编译,代码将再次按预期工作

如何强制编译器不只为 foo() 添加 RVO(也就是不强制 -fno-elide-constructors)?

Update1:​​代码必须适用于任意编译器(至少 gcc、clang、msvc),示例代码:

Update2:问题是,编译器优化了 x 的实例

或者

没关系。例如,发生段错误是因为

x1 被优化,实现尝试访问第一个参数,它是一个空指针。