有些人没有意识到可以按C中的值传递和返回结构 。 我的问题是关于在C中返回结构时编译器做不必要的拷贝。像GCC这样的C编译器使用返回值优化(RVO)优化还是C ++唯一的概念? 我所读到的关于RVO和copy elision的一切都是关于C ++的。 我们来看一个例子。 我目前正在C中实现一个double-double数据types (或者浮动浮动开始,因为我发现很容易unit testing)。 考虑下面的代码。 typedef struct { float hi; float lo; } doublefloat; doublefloat quick_two_sum(float a, float b) { float s = a + b; float e = b – (s – a); return (doublefloat){s, e}; } 编译器是否会创build我返回的doublefloat值的临时副本,或者临时副本是否可以被删除? 那么C中的命名返回值优化(NRVO)呢? 我有另一个function doublefloat df64_add(doublefloat a, doublefloat b) { doublefloat […]
什么是复制elision? 什么是(命名)返回值优化? 他们意味着什么? 在什么情况下可以发生? 什么是限制? 如果你是参考这个问题,你可能正在寻找介绍 。 有关技术概述,请参阅标准参考 。 在这里查看常见情况 。
我正在阅读复制和交换 。 我尝试阅读Copy Elision上的一些链接,但无法正确理解它的含义。 有人可以解释一下这个优化是什么,特别是下面的文字是什么意思 这不仅仅是一个方便的问题,实际上是一个优化。 如果参数绑定到一个左值(另一个非const对象),则在创build参数时会自动创build该对象的副本。 但是,当s绑定到右值(临时对象,文字)时,副本通常会被省略,从而保存对复制构造函数和析构函数的调用。 在参数接受为常量引用的赋值运算符的早期版本中,当引用绑定到右值时,复制elision不会发生。 这导致一个额外的对象被创build和销毁。
在2016年的Oulu ISO C ++标准会议上,标准委员会将一个名为Guaranteed Copy Elision的提议通过简化的值类别投票给了C ++ 17。 保证副本的精确度如何工作? 它是否涵盖了一些已经允许复制删除的情况,或者是否需要更改代码以保证复制省略?