如何有效地将输入参数传递给函数

时间:2019-03-26 08:58:01

标签: c++

我的结构定义为

typedef struct _ans{
int  **a;
int *b; double*c; int *d, int *e, float *f, double *g;} ans;
ans *temp;

“ a”是一个二维数组,对于该数组中的每一行,让第i行,我将在向量“ b,c和d的第i个元素中定义一个对应的值,等等”。

我想创建一个函数“ func”来修改数组“ a”中的第i行;显然,每当修改“ a”中的第i行时,也应重新计算其在“ b,c和d等”向量中的对应值。

我有两种可能性:

1-将func定义为

func(temp->a[i], temp->b[i], temp->c[i], temp->d[i], temp->e[i], temp->f[i],temp->g[i])

具有许多输入参数,但全部与第i行有关。 要么 2-只需将“ temp”作为func的唯一输入参数即可:

 func(temp) 

然后在函数内,我可以轻松访问其他向量b,c等中的第i行及其对应的值。

我想知道在代码效率和计算时间方面,这两种情况中哪一种效率更高。

任何建议都值得赞赏

2 个答案:

答案 0 :(得分:2)

下面仅是一般性内容。到目前为止,您可能有充分的理由做出选择,但是对我来说,它们看起来是错误的。

您的设计是错误的,并且您对节省计算时间的关注放错了地方。软件的最大成本是人工成本。始终优先考虑的是使您的代码尽可能简单明了且易于理解。

您的数据结构中存在两个明显的缺陷,即过度使用指针和对相关项进行分组不足(换句话说,并行数组)。这样会更好

struct Row
{
    std::vector<int> a;
    int b;
    double c;
    int d;
    int e;
    float f;
    double g;
};

struct Ans
{
    std::vector<Row> a;
};

Ans temp;

通过这种重新设计,您的func函数的正确位置变得显而易见。它应该是Row结构的一种方法,在该方法中它将可以访问所需的所有数据。

struct Row
{
    void func();
    std::vector<int> a;
    int b;
    double c;
    int d;
    int e;
    float f;
    double g;
};

尽管改进了设计,但此解决方案等效于您的第二个选择。

您还应该努力使结构中的数据私有。

答案 1 :(得分:1)

首先,无需使用C ++的typedef结构。只是说

struct ans {
    int **a;
    int *b; double*c; int *d; int *e; float *f; double *g;
};

接下来,不要使用C样式的数组,例如,使用std::vector之类的标准容器。

#include <vector>

struct ans {
    std::vector<std::vector<int> > a;
    std::vector<int> b;
    std::vector<double> c;
    std::vector<int> d, e;
    std::vector<float> f;
    std::vector<double> g;
};

这样,您不必自己搞乱动态内存。

最后,只需定义temp对象,再次无需动态分配它

ans temp;

要回答这个问题,通过引用传递结构将是最有效的,因为它涉及的复制数据最少:

void func(ans &a);

尽管,传递参数时间通常可以忽略,除非它一遍又一遍地做多次。