繁体   English   中英

将临时对象作为参数传递(C ++)

[英]Passing temporary objects as argument (C++)

临时对象有时是用C ++创建的。 STL valarray类中的一个示例是slice_array ,每次选择一系列valarray的索引时都会调用slice_array。 http://www.cplusplus.com/reference/valarray/slice_array/

我的问题是这样的:

将这些临时对象作为参数传递给函数时,是否传递了这些对象的副本,还是仅传递了引用?

例如,想象一下这两个朴素的功能:

double simple_product(double* inp,int length){
  double res=1;
  for(int i=0;i<length;++i){
      res = res*inp[i];
  }
  return(res);
}

double sum_selected(valarray<double> v){

    simple_product(&v[0],v.size());
    return(v.sum());
}

如果我以以下方式致电给他们:

valarray<double> valery(10,10);
size_t sel[] = {1,3,4};
valarray<size_t> selection (sel,3);
cout << sum_selected(valery[selection]);

是否将在功能sum_selected的堆栈中临时创建一个大小为3 * size_t的新对象?

请注意, double sum_selected(valarray<double> & v)将函数声明为: double sum_selected(valarray<double> & v) (临时对象只能绑定到const引用)。

之所以如此有趣,是因为例如在此处无法将函数声明为:

double sum_selected(const valarray<double> & v) ,因为不能调用函数simple_product (假定为不可更改)。 但是,如果数组很大,则为传递的参数制作一个临时副本将对内存造成问题。

如果声明该函数按值接受参数,则按值传递该值,从而创建该对象的新副本:

void f(thing t);           // pass by value

如果声明通过引用接受其参数,则通过引用传递。 但是只能通过constrvalue临时引用:

void f(thing const & t);   // OK: const lvalue reference
void f(thing && t);        // OK: rvalue reference
void f(thing & t);         // Error: lvalue reference can't bind to temporary

通过引用传递不会创建新对象,并且临时对象的生存期在函数调用期间一直有效,直到创建它的语句结束为止。

valarray<T>::operator[](valarray<size_t> const&)返回一个indirect_array<T>引用 ),或const限定运算符的valarray<T> ,而不是slice_array

如果您希望能够以连续数组访问所选元素,则需要将它们收集到连续数组中。 转换构造函数valarray<T>::valarray(indirect_array<T> const&)为您完成此操作。 在这种情况下,引用语义将是无用的,因为不存在将所需元素连续排列的现有对象。

将函数签名更改为double sum_selected(valarray<double> const&)不会对您的代码造成任何影响,因为无论如何都构造了一个临时valarray<double> 在不通过下标直接传递valery的情况下,这样做会更加有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM