C 函数和性能的返回值

C 函数和性能的返回值,c,gcc,C,Gcc,考虑这两个C函数,它们具有不同的头,但相同的主体仅在返回结果的方式(通过堆栈或指针)上有所不同:tf1(int x)和void f2(int x,T*ret)其中sizeof(T)>=16。 在调用f1而不是调用f2时,是否会有性能损失?或者类似于gcc-O2的编译器会将两个调用优化为类似的结果。从我看到的情况来看,会有性能损失。对于f1,函数必须创建一个T类型的对象,然后返回该对象的一个副本,因为您没有指定应该从引用或指针返回该对象(但随后函数必须为其分配内存) 但是对于f2,您正在发送一个类

考虑这两个
C
函数,它们具有不同的头,但相同的主体仅在返回结果的方式(通过堆栈或指针)上有所不同:
tf1(int x)
void f2(int x,T*ret)
其中
sizeof(T)>=16

在调用
f1
而不是调用
f2
时,是否会有性能损失?或者类似于
gcc-O2的编译器会将两个调用优化为类似的结果。

从我看到的情况来看,会有性能损失。对于f1,函数必须创建一个T类型的对象,然后返回该对象的一个副本,因为您没有指定应该从引用或指针返回该对象(但随后函数必须为其分配内存)

但是对于f2,您正在发送一个类型为T的对象,您已经为它分配了内存。这节省了时间,因为函数不必创建新对象或为其分配内存


虽然我不确定使用gcc 2级优化是否使用RVO来避免将对象复制为返回类型。

f2
的调用者,应该将其作为指向某些已分配位置的指针传递给
ret
,但只是构建了默认POD(即未初始化)位置,还是会有一些非平凡的构造函数?@左撇子没有构造函数,预分配的空间。可能的复制品是CHA-它在几分钟前被标记为C++……我不确定。因为在代码中分配代码> t>代码>堆栈是通过改变“StAcKoPosits”来完成的。在C++语言中,C++中的移动语义使这种语言中的优化变得疯狂。詹姆斯:对不起,没听到。我看到了<代码> t>代码>,认为这是一个C++模板。