c++函数返回与函数设置指针

C++ Functions returnings vs Functions setting a pointer

本文关键字:函数 指针 设置 返回 c++      更新时间:2023-10-16

我想知道返回值的函数和将值设置为指针的函数之间的区别,例如:

指针:

int myVal;
ptr_multiply(5, 5, &myVal);
cout << myVal << endl; //Output: 25

返回:

int myVal = rtn_multiply(5, 5);
cout << myVal << endl; //Output: 25

我的问题集中在创建函数时选择什么方法,为什么,以及每种方法的优缺点。

可读性是函数通常返回您所期望的结果的主要原因。然而,由于这是非常主观的,我建议你在你的项目中努力保持一致性。

当你想让一个函数返回多个东西,而不是将它们组合在一个结构中以便返回它们时,另一种方法是在输出参数中返回它们。

如果要返回大量数据,那么可能会遇到性能瓶颈。原因是必须复制返回值。

但是在大多数情况下,你不必担心这个,因为现代编译器能够自动内联这样的东西。

旁注:在c++中尽量避免裸指针(使用引用,智能指针)

使用"pointer"方法的一个优点是可以通过传入非const引用或指针来获得多个"返回"值。例如:

int output1;
int output2;
get_values("input", &output1, &output2)

可以返回成功/失败:

int v = -1;
if(ToInt("wibble",&v)){
  // do something with v
}

将失败,因为"wibble"不能转换为int。

另一个有用的地方是函数不需要改变v:

int v = previousValue;
UpdateIfNewValueFound( &v )

返回值。在现代编译器中,应该在性能上与几乎没有区别,但是返回值有几个优点:

  • 根据定义,这是函数应该做的(即函数从域映射到上域)。
  • 自我记录;如果我使用的是不熟悉的API,除非有很好的文档,否则如果在参数集中返回值,那么输入/输出是什么可能会令人困惑。返回值没有歧义,并且需要更少的文档。
  • 它更容易使用-可以一半的行数所需的!比较

    int r = f();
    

    int r;
    f(&r);
    
  • 它可以让你成为一个更好的程序员;你必须花更多的精力从一个函数返回多个值(例如,通过structpair,而不是添加另一个参数)。如果你发现你需要经常这样做,额外的努力可能会迫使你更仔细地考虑你的代码设计——通常一个函数只做/返回一件事是更好的。

另一个区别是堆栈或堆。

返回值位于堆栈顶部。指针变量位于堆中。

例如(用于演示堆栈返回的无感知递归代码):

typedef std::array<int,1000> KByte;
KByte tmp;
KByte f(int nr) {
    if (nr == 1) { tmp[nr]=nr; return tmp; }
    else { tmp[nr]=nr; return f(nr-1); };
}
void f2(int nr, KByte& ret) {
    if (nr == 1) { ret[1]=1; }
    else { ret[nr]=nr; f2( nr-1, ret ); }
};

调用

KByte t = f(999); /* Stack error */

应该给你一个堆栈大小错误,因为堆栈上的1000 KByte (1GB)太多了。

调用

KByte t2;
f2( 999, t2 );

应该没有堆栈问题。(它也使用递归深度1000,但不把返回值放在堆栈上。