有些人可能不知道在C语言中可以通过值传递结构体并返回结构体。我的问题是当在C语言中返回结构体时,编译器是否会进行不必要的复制。C语言编译器(例如GCC)是否使用返回值优化(RVO)优化?还是这只是C++中的概念?我所读到的关于RVO和拷贝省略的所有内容都是关于C++的。
让我们考虑一个例子。我目前正在C语言中实现一个双倍精度数据类型(或者从float-float开始,因为我觉得它易于单元测试)。请考虑以下代码。
在这种情况下,我正在返回一个命名结构体。在这种情况下,临时副本是否可以省略?
应该说明的是,这是一个关于C语言的一般性问题,并且我在这里使用的代码示例仅为示例(当我进行优化时,我将使用带有内部函数的SIMD)。我知道我可以查看汇编输出以查看编译器的操作,但我仍然认为这是一个有趣的问题。
让我们考虑一个例子。我目前正在C语言中实现一个双倍精度数据类型(或者从float-float开始,因为我觉得它易于单元测试)。请考虑以下代码。
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;
}
在这种情况下,我正在返回一个命名结构体。在这种情况下,临时副本是否可以省略?
应该说明的是,这是一个关于C语言的一般性问题,并且我在这里使用的代码示例仅为示例(当我进行优化时,我将使用带有内部函数的SIMD)。我知道我可以查看汇编输出以查看编译器的操作,但我仍然认为这是一个有趣的问题。