[英]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
如果声明通过引用接受其参数,则通过引用传递。 但是只能通过const
或rvalue临时引用:
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.