假设我有一个功能
double tauscale(NumericVector x){
int n = x.size();
const double k = 2;
double sc = 1.48*sqrt(median(x*x));
double tauscale = 0.0;
for(int i = 0 ; i < n ; ++i){
tauscale = tauscale + rhobiweight(x(i)/sc,k);
}
return (1.0/n)*pow(sc,2)*tauscale;
}
现在我们在这里看到函数rhobiweight
接受两个双精度数,目前写为:
double rhobiweight(double x,double k = 2.0){
double rho = 1.0;
if(std::abs(x)<k){
rho = 1.0-pow((1.0-pow(x/k,2)),3);
}
return rho/Erho(k) ;
}
问题是:如何使用指针或引用,以便不复制x值?理想情况下,计算时间和内存使用应该与我从未编写rhobiweight相同,但直接在tauscale
中实现此函数。
答案 0 :(得分:7)
如何使用指针或引用,以便不复制x值?
通过将参数声明为指针或引用。但是不要这样做。然后你需要复制变量的地址,这同样慢,因为double的大小与内存地址的大小相同(或几乎相同)。不仅如此,您还需要在函数中使用指针时取消引用指针。或者取消引用它并反正复制值。
理想情况下,计算时间和内存使用应该与我从未编写rhobiweight相同,但是直接在tauscale中实现此功能。
如果函数由优化器内联展开,则会发生这种情况。没有标准的方法可以强制编译器扩展内联函数,但是如果优化器认为它是有利的,并且你已经启用了优化,那么只要该函数是无法使用的,它就会这样做。要使函数无法使用,请确保在调用站点上可以看到该定义。一个简单的方法是声明函数inline
。
请注意,如果内联许多函数调用,峰值内存使用率可能会更高。
答案 1 :(得分:6)
TL; DR:请勿尝试这样做。
全文:
你问: “我如何利用指针或引用使得x值不被复制?”
如果您在打开优化的情况下编译程序,则无论如何都不会复制变量。使用指针和/或引用可能会让事情变得更慢。
这引出了一个更重要的观点:你怎么知道复制价值观需要很长时间?为什么你会期望使用指针花费更少的时间?
优化代码的方法是度量花费时间的地方,然后尝试对其进行优化。