在按值调用 (c++) 中转发构造函数参数
Forwarding constructor arguments in call-by-value (c++)
假设我有一个这样的函数
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))
相关文章:
- 在按值调用 (c++) 中转发构造函数参数
- 完美的转发和构造函数
- 我可以在构造函数的主体中转发构造吗?
- 通过类型别名从构造函数转发模板推导
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 完美的转发构造函数和已删除的构造函数
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- 使用完美转发的模板转换构造函数
- 禁用 std::optional的转发构造函数
- 通过转发构造函数参数来构建基于可变参数模板的 mixin
- 为什么我们应该为initializer_list的情况过多载荷转发构造函数
- 在类层次结构中,完美的转发构造函数和复制构造函数之间的冲突
- 完美的转发功能与完美的转发构造函数
- 转发构造函数调用基类的复制构造函数2次
- 使用declard和参数转发构造函数隐式复制结构
- 临时寿命和完美的转发构造函数
- 如何为类似元组的可变类创建一个完美的转发构造函数
- 复制构造函数和转发构造函数之间存在冲突
- 单例、奇怪的重复模板模式和转发构造函数参数
- 通过接口转发构造函数参数