有些人不知道这是possible to pass and return structs by value in C.我的问题是关于编译器在C.中做 struct 时,不做拷贝,例如GCC使用Return value optimization(RVO)优化,或者这是C++的概念吗?我所读到的关于RVO和复制删除的内容都是关于C++的.
让我们考虑一个例子. 我目前正在C中实现double-double data type(或者更确切地说,从浮点-浮点开始,因为我发现它很容易进行单元测试).请考虑以下代码.
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};
}
编译器会对我返回的doublefloat
个值进行临时复制,还是可以省略临时复制?
那么C语言中的命名返回值优化(NRVO)呢?我还有一个功能
doublefloat df64_add(doublefloat a, doublefloat b) {
doublefloat s, t;
s = two_sum(a.hi, b.hi);
t = two_sum(a.lo, b.lo);
s.lo += t.hi;
s = quick_two_sum(s.hi, s.lo);
s.lo += t.lo;
s = quick_two_sum(s.hi, s.lo);
return s;
}
在本例中,我将返回一个命名 struct .在这种情况下,临时副本可以省略吗?
应该指出的是,这是C语言的一个一般性问题,我在这里使用的代码示例只是示例(当我优化它时,我将使用SIMD和intrinsic).我知道我可以通过查看汇编输出来了解编译器的功能,但我认为这是一个有趣的问题.