我在这里指的是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 等没有什么不同。大家干杯。