考虑两个功能:
int foo(int, int);
和
int bar(int*);
(假设 bar 在一个大小为 n 的数组中传递,其中 n = # of foo 参数,各自的值是等价的,并且函数在功能上是相同的)
前一种方法比后一种方法“更好”吗?
考虑两个功能:
int foo(int, int);
和
int bar(int*);
(假设 bar 在一个大小为 n 的数组中传递,其中 n = # of foo 参数,各自的值是等价的,并且函数在功能上是相同的)
前一种方法比后一种方法“更好”吗?
这取决于您所说的“更好”是什么意思:如果传递多个参数更符合程序的逻辑结构,那么传递多个参数的可读性肯定要好得多。一个很好的测试是否可能是这种情况是询问数组的各个元素是否会从单独命名中受益。如果答案是“是”,那么单个参数会更好。在传递参数时在这里和那里保存几个字节并不能弥补可读性的轻微损失。
是的,前一种方法int foo(int, int);
可以在编译时检查参数。int bar(int*)
需要对传入的数组进行假设。
我能想到的一个缺点int bar(int*)
是它会使超载变得更加困难。例如:
int areaOfRectangle(int width, int height);
int areaOfRectangle(int x1, int y1, int x2, int y2);
很好,但是你将如何使用数组来做到这一点?
int areaOfRectangle(int* widthHeight);
int areaOfRectangle(int* coordinates); // error
以上将无法编译,因为int areaOfRectangle(int*)
不能声明/定义两次。
此外,如果您只是使用数组作为任意分组参数的一种方式,您的代码会更难阅读和使用。比较:
int calculateIncome(int normalHours,
int overtimeHours,
int normalRate
int overtimeRate); // Self documenting
int calculateIncome(int* parameters); // How do I use this function?
int calculateMean(int* numbers); // Parameters are logically grouped,
// so array makes sense
第三个问题(桑乔在他的回答中描述)int bar(int*)
是危险的。当用户调用你的函数一个比你期望的更小的数组时会发生什么?int Foo(int, int)
另一方面,使用错误数量的参数调用将无法编译。
这取决于“更好”是什么:
为了获得更好的性能:
1 如果数组只有几个元素(比如少于6个参数,取决于目标CPU,可用的寄存器可以用来传递参数),foo()方法更好,因为所有变量都可以通过寄存器传递;而 foo 可以直接从寄存器中取出值。而对于 bar,需要取消引用指针。
2 如果数组有超过 10 个项目。最好使用指针进行传递,因为这样可以减少将参数压入堆栈顶部的堆栈操作。
对于更少的错误:foo() 方法更好,因为对于 bar() 方法,可以通过 bar 中的语句修改项目,从 bar() 返回后可以看到,如果不维护可能会导致错误仔细操作 bar() 中的项目。