在按值调用 (c++) 中转发构造函数参数

Forwarding constructor arguments in call-by-value (c++)

本文关键字:转发 构造函数 参数 c++ 值调用      更新时间:2023-10-16

假设我有一个这样的函数

void foo(std::vector<int> data)

现在我想调用这个函数,但我的向量很大,我只需要传递它的一部分。显然,我想避免不必要的副本(函数foo应该用它被调用的向量制作一个本地副本(。

我想实现这样的事情:

std::vector<int> largeVector(1e6); // some large data vector
int nPointsToUse = 400; // only a small fraction of it is needed
int offset = 2000;
foo(largeVector.begin() + offset, largeVector.begin() + offset + nPointsToUse)

但这显然是行不通的,因为foo期望一个参数,即整数向量。

我可以在调用foo之前只复制数据向量的一部分,然后通过引用函数传递复制的向量,但我想保持其签名不变。

有没有实现我想要的好方法?这样函数基本上用我提供给函数的参数调用向量的构造函数?

应应用复制省略法:

foo({largeVector.begin() + offset, largeVector.begin() + offset + nPointsToUse});

否则更改foo以采用迭代器或范围(如std::span(。

使用当前版本的foo无法避免至少一个vector副本

如果您拥有foo函数并且它对vector执行只读操作,请将签名更改为void foo(const vector<int> & x)

如果您无法更改签名,则可以在呼叫者端使用std::move以避免额外的不必要的副本。

foo(std::move(newVectorSlice))