假设我有这些功能
std::Vector<Point> calculate() {
std::Vector<Point> points; //do stuff with points
return points;
}
和
void calculate(std::Vector<Point>& points) {
//do stuff with points
}
所以我的问题特定于在堆栈上初始化的对象,并且是 stl 对象。性能有什么区别吗?流行的方法是什么
问候
以值作为参考参数,具有以下性质:
返回值具有以下属性:
[[nodiscard]]
属性可用于丢弃值绝对不正确的情况。由于复制省略,性能很可能是相同的。
两种方式表达的内容不同
std::vector<Point> calculate()
返回一个向量(可能基于某些参数)。
void calculate(std::vector<Point>& points)
修改现有向量(同样,可能基于参数)。
我的拙见:大的返回值会产生比解决更多的问题......它们看起来更简单,它们在调用段中更简洁,但会避免右值引用。
如果你看看旧的、但专为效率而设计的软件包,如 BLAS 和 LAPACK,大对象是通过引用传递的,返回值只是错误标志或双精度(例如 BLAS 中的 ddot)。
缺点是表现力会降低,但成本很小,因为内存分配等资源会向上游移动。
C++ 在语法和资源管理方面可以得到显着简化。传递非常量引用在“美观”和代码长度方面会产生成本,但它是有效的。
例如,在 BLAS 中:
如果是小件物品,可以退货,例如: DDOT
double cblas_ddot(const int N, const double *X, const int incX,
const double *Y, const int incY);
如果它很重要,比如矩阵,例如DGEMM,
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,const enum CBLAS_TRANSPOSE TransB, const int M, const int N,const int K, const double alpha, const double *A, const int lda, const double *B, const int ldb,const double beta, double *C, const int ldc);
这在科学计算中是众所周知的——传递大对象的指针或非常量引用。