c++函数返回与函数设置指针
C++ Functions returnings vs Functions setting a pointer
我想知道返回值的函数和将值设置为指针的函数之间的区别,例如:
指针:
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);
-
它可以让你成为一个更好的程序员;你必须花更多的精力从一个函数返回多个值(例如,通过
struct
或pair
,而不是添加另一个参数)。如果你发现你需要经常这样做,额外的努力可能会迫使你更仔细地考虑你的代码设计——通常一个函数只做/返回一件事是更好的。
另一个区别是堆栈或堆。
返回值位于堆栈顶部。指针变量位于堆中。
例如(用于演示堆栈返回的无感知递归代码):
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,但不把返回值放在堆栈上。
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针