我正在写一个用于科学计算的程序,我最感兴趣的(在正确性之后)是速度。最近我注意到我也需要可读的代码。:)
而不是写作
for (int k=0;k!=10;k+=1)
array[k] = fun(a, k);我在考虑写
class fun_t {
private:
type a;
public:
fun_t(type in) : a(in) {};
type operator() (int k) {
...computation...
}
};
...
fun_t fun(a);
for (int k=0;k!=10;k+=1)
array[k] = fun(k);函数对象样式会和第一个例子一样快吗?我能期望在两者中有相同的内联吗?有没有更好的方法?(请注意,我只是在这里展示想法,这不是我的实际代码。)
发布于 2012-10-25 19:56:57
你可以期待来自一个合理的编译器的相同的内联。就像对fun(a,k)的调用一样,调用operator()的目的地在编译时是已知的。
我看到的不同之处在于对a的访问。在使用函数fun的情况下,将某些内容作为参数进行传递--如果没有fun的声明,就不可能看到这是a的副本、对a的引用,还是从a构造的其他类型。
对于函数器fun_t,只需复制a一次即可构造函数器。您(名义上)将fun_t*作为this传递给operator(),然后以this->a的身份访问a。一旦一切都内联并完成了优化器,额外的间接性就很可能被省略了,但话又说回来,它可能还没有完成。您必须检查特定的情况,可能是通过检查编译器发出的指令。
https://stackoverflow.com/questions/13067432
复制相似问题