考虑两个功能:
int foo(int, int);
和
int bar(int*);
(假设bar在大小为n的数组中传递,其中n = foo参数的#,相应的值是等价的,函数在功能上是相同的)
采用前一种方法而不是后者会更好吗?
答案 0 :(得分:3)
这取决于“更好”的含义:如果传递多个参数更好地与程序的逻辑结构保持一致,那么传递多个参数的可读性肯定要好得多。对这种情况是否属于这种情况的一个很好的考验是询问阵列的各个元素是否会从单独命名中受益。如果答案是“是”,则各个参数更好。在传递参数时,在这里和那里保存几个字节并不能弥补可读性的轻微损失。
答案 1 :(得分:2)
是的,前一种方法int foo(int, int);
可以在编译时检查参数。 int bar(int*)
需要对传入的数组做出假设。
答案 2 :(得分:1)
int bar(int*)
我能想到的一个缺点是,它可能会使重载变得更加困难。 E.g:
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)
将无法编译。
答案 3 :(得分:0)
取决于“更好”是什么:
为了获得更好的表现:
1如果数组只有少数元素(比如说小于6个参数,取决于目标CPU并且可用的寄存器可用于传递参数),则foo()方法更好,因为所有变量都可以通过通过注册;和foo可以直接从寄存器中获取值。对于bar,需要取消引用指针。
2如果阵列有超过10个项目。最好使用指针传递,因为这会将堆栈操作推到堆栈顶部。
减少错误: foo()方法更好,因为对于bar()方法,可以通过bar中的语句修改项目,这些语句在从bar()返回后可以看到,如果不维护项目的操作,这可能会导致错误在酒吧()仔细。