将多个参数传递给函数的最有效方法?

时间:2015-08-19 08:18:34

标签: python c++ c arrays function

将大量用户输入变量作为参数传递给函数以及返回多个结果的最有效(在处理速度和内存利用率方面)是什么?

每次调用函数时都会有一长串参数和返回值 - 例如(a,b,c,d,e,f,g)= MyFunction(a,b,c,d,e,f,g) - 似乎不优雅,我猜测也是低效的;特别是如果我必须重复或递归地调用该函数。

然而,将整个变量列表定义为函数外的全局变量也很丑陋,并且随着程序的增长,变量名称会无意中被分配给几个不同的变量。

我已经尝试将所有变量放入单个数组或列表中,并将其作为单个参数传递给函数,因为这似乎更整洁。 我是否正确认为这也更有效,即使对于大型数组也是如此,因为它只是指向每次传递给函数的数组开头的指针,而不是整个数组本身? 如果数组是向函数传递大量变量或从函数传递大量变量的最佳方法,那么这种效率节省在什么时候开始 - 例如如果参数的数量小于5,最好传递一串参数,但如果需要5个或更多参数,则使用数组或列表?

之前关于StackExchange的讨论: Elegant way to pass multiple arguments to a function 建议使用struct而不是vectors / arrays来传递多个参数。为什么这种方法更倾向于使用数组,并且在什么时候效率节省证明了使用struct的额外复杂性?

我还应该考虑哪些方法可以在Python或C / C ++中使用? (例如,我是面向对象编程的新手,但想知道这是否可以提供特定的解决方案  到Python?)

非常感谢

2 个答案:

答案 0 :(得分:2)

所有这些都取决于目标系统及其函数的调用约定。这个答案仅适用于C和C ++。

通常,文件范围变量的使用通常是最快的。在这种情况下,变量永远不应该被声明为全局(在整个项目中可访问),而是作为静态变量(仅由本地文件访问)。

但是,应该避免使用这样的静态文件范围变量有几个原因:它们会使代码更难以阅读和维护,无纪律的使用可能会导致“意大利面条代码”,它们会产生重新进入问题并且会增加一些额外的文件范围命名空间的标识符。

应该注意的是,如果参数的数量有限,将它们保持为单独的参数可能会提高性能,因为编译器可能会将其中一些存储在CPU寄存器中而不是将它们存储在堆栈中。 CPU寄存器是将参数传递给函数的最快方法。这是如何工作的是系统特定的。但是,以希望通过CPU寄存器传递参数的方式编写程序,在大多数情况下都是预先成熟的优化。

传递多个参数的最佳,事实上的方法确实是创建一个包含所有参数的自定义结构(或C ++类)。然后通过引用函数传递该结构。尝试使结构只包含彼此相关的变量。考虑在一个单独的参数中放置彼此不相关的变量,或者仅为一个给定函数设置特殊变量。在大多数情况下,良好的程序设计会取代效率。

结构/类是优选而不是数组的原因仅仅是因为变量一起形成唯一类型,但也因为它们可能具有彼此不同的类型。制作一系列具有不同类型的变量没有任何意义。

在C ++中,类提供了一个优于数组的优点,例如构造函数和析构函数,自定义赋值运算符等。

答案 1 :(得分:0)

显然取决于你想做什么,因为每个容器都有不同的用途。

当然,在处理速度和内存方面,你应该使用指针或对容器的引用(结构,类,数组,元组...),以便不复制所有数据而只复制地址容器。

但是,您不能创建结构,也不能将所有变量放在同一个容器中,以便将它们作为函数的参数。您将在数据结构上放置的所有变量都应该是相关的。

在您提供的示例中,有多个不同类型的变量。这就是首选结构的原因,因为数组要求所有参数都具有相同的类型。在python中,您可以使用named tuple来存储不同的变量。

相关问题