对于计算密集型函数,类函数参数是否比C ++中的类变量更好?

时间:2016-08-18 12:38:10

标签: c++ matlab

我正在实现一个将对一组图像执行计算的类。但是,算法有一些参数。我还计划构建一个MATLAB接口来使用该类,并使用MATLAB进行计算。

我想知道如何更好地设计类,以及在调用成员函数或将它们作为类属性存储在类中时是否更好地传递参数。这是我在C ++中的高级设计:

class ComputationClass {
  public:
    ComputationClass(InfrastructureClass cl);
    std::vector<float> computation_algorithm_1(std::vector<float> data);
    std::vector<float> computation_algorithm_2(std::vector<float> data);

  private:
    InfrastructureClass cl_;

    float computation_part_for_both_functions(std::vector<float> data);
};

该类需要另一个类的对象,该对象将一部分计算作为API执行。我无权访问其他类,我只是做了一些请求等等。

现在,两种计算算法(computation_algorithm_1computation_algorithm_2)都有一组常见的参数。例如:

  • size_t max_allowed_iterations
  • float stopping_criterion
  • int power_of_Q(提升其中一个算法参数的能力

但是第二个算法有两个额外的参数,float step定义每次迭代改变结果的程度,bool preprocess定义是否需要预处理。这些算法彼此完全不同,但它们通过使用float computation_part_for_both_functions()函数具有一些共同的功能。他们遵循相同的想法,但他们有不同的步骤。

  1. 一种选择是将算法参数实现为类变量(如果没有提供,构造函数将初始化它们)并且我还需要有一些setget函数。在调用算法之前,用户(来自C ++或MATLAB API)必须有set个参数。
  2. 另一个选择使函数接受更多参数。简化类,但函数可能会收到大量参数。此外,大多数算法参数都是可选的,它们有一些默认值。
  3. 问题是这些函数接收的参数列表可能会在不久的将来发生变化,并且可能会添加更多参数。

    编辑:我正在考虑提供一些public嵌套类或struct,以便我可以将我需要的参数传递给函数,因为你不能跳过C ++中的默认参数,但是我做了不知道这是不是一个好的设计。

1 个答案:

答案 0 :(得分:2)

回答标题中的问题: 从计算的角度来看,如果你使用函数参数或类字段,我会说没关系。两者都同样有效。

然而,有一些边缘情况,其中一个或另一个有优势。

  1. 如果函数是递归的,显然重复参数是不必要的,并且会增加一些小的开销。在这里,类字段可能是合适的。
  2. 如果您经常访问参数,访问类的字段需要一个额外的间接(在堆栈上访问this,然后访问this->parameter vs。 access {{ 1}}在堆栈上)。在这里,函数参数可能更好。
  3. 在两种边缘情况下,如果核心算法非常快,它只会产生可测量的差异,主要的计算时间用于递归或访问参数。

    如果有疑问,我更喜欢功能参数,因为它们更直观。 (这当然是完全主观的。但我也习惯于函数式编程以及R,其中参数很少在单独的状态变量中设置。)

    如果您有许多参数,可以考虑使用类字段(或单独的parameter)。然后,功能签名可能看起来很难看:

    struct parameters

    但是,如果使用类字段,则会在某处定义相同的参数集。因此,也可以重新格式化签名:

    return_type algorithm(int parameter1, double parameter2, int parameter3, int parameter4, int parameter5, double parameter6, int parameter7, int parameter8, bool parameter9, double parameter10, bool parameter11, double parameter12, int parameter13, double parameter14, int parameter15, int parameter16, bool parameter17, double parameter18, int parameter19, double parameter20, int parameter21, int parameter22, bool parameter23, double parameter24)
    

    要考虑的另一点(从代码维护的角度来看)是将参数传递给各种子例程。然后,拥有一个紧凑的return_type algorithm( int parameter1, double parameter2, int parameter3, int parameter4, …) 对象可能肯定会更好。

    从用户界面的角度来看,用户将参数传递给函数肯定更方便直观。但是,这不会阻止您在类中设置字段。但我只想补充一点这一点。

    正如您在评论中所说,许多参数都有可选值;并且在C ++中不可能定义可选参数的任意子集。 由于您的函数是从Matlab调用的,我只是建议在Matlab中编写一个简单的包装器来处理所有可选参数,然后使用完整的集合调用C ++函数。