在 C++ 中,以结构体作为参数的自由函数是否比具有成员函数的类更快地完成相同的操作?

问题描述 投票:0回答:1

我在这里指的是Klaus Iglberger 的永恒演讲。我有一个(相对)简单的函数,它接受一个浮点数作为输入,并将结果作为另一个浮点数返回。然而,该函数需要许多参数,这些参数必须预先计算(否则它根本不快)。在我看来,我可以创建一个结构来保存预计算,然后将其与函数的参数一起提供给自由函数以进行近似,或者编写一个类来将预计算作为私有成员保存一个公共成员函数,用于根据感兴趣的参数执行近似计算。

我不想在这里深入探讨意见。可以说,这两种方法都一样干净,并且生成的代码与另一种方法一样清晰。 为

fastApprox
成员函数指定一个有意义的名称,让开发人员了解近似值的含义,然后使用结构体调用 free 函数或调用类 public 函数,仅在调用顺序方面有所不同。出现术语,一个有句点,另一个有逗号。

struct StrPrecomp {

  StrPrecomp(float alpha_in);

  float c0;
  float c1;
  float c2;
};

float fastApprox(const StrPrecomp s, float x) {
  return s.c0 + ((s.c1 + (s.c2 * x)) * x);
}

class ClsPrecomp {
public:
  ClsPrecomp(float alpha_in);

  float fastApprox(float x) {
    return c0 + ((c1 + (c2 * x)) * x);
  };

private:
  float c0;
  float c1;
  float c2;
};

int main() {
  StrPrecomp ms(0.5);
  ClsPrecomp mc(0.5);
  printf("Struct Result: %12.4f\n", fastApprox(ms, 0.7071));
  printf("Class  Result: %12.4f\n", mc.fastApprox(0.7071));
}

性能方面哪个更好? Klaus 站在自由函数一边,因为这些类成员函数中隐含了

this
指针。但“这个”案例真的有区别吗?下面我通过 const 值将结构提交给 free 函数,这会让许多 C++ 开发人员感到不快,但在这种情况下速度是相同的,因为下面没有 std::vector 或其他可复制的成员,这可能会导致大量的偷偷摸摸的深度复制。如果我要通过 const 引用提交结构,它本身就是一个指针,并且我希望,在性能上与类对每个成员取消引用 this->c0 等没有什么不同。
大家干杯。

c++ pointers optimization struct this
1个回答
0
投票

© www.soinside.com 2019 - 2024. All rights reserved.