我应该通过std :: function by-value还是通过(rvalue)-reference?

时间:2016-04-01 11:50:06

标签: c++ c++11

我不太明白std::function实际包含的是什么。

通过按值或按引用传递它是否更有效?

以下示例中的性能影响是什么?

通过值:

void printStats(std::function<void(const char *)> printer);
. . .
std::string tmp;
printStats([&tmp](const char * msg){ tmp += msg; });

by rvalue-reference:

void printStats(std::function<void(const char *)>&& printer);
. . .
std::string tmp;
printStats([&tmp](const char * msg){ tmp += msg; });

1 个答案:

答案 0 :(得分:6)

首先,在目标是std::function的函数指针的情况下,需要std::reference_wrapper来避免分配;实现是encouraged to avoid allocation for "small" targets

  例如,

[...]其中f的目标是一个只包含对象和成员函数指针的指针或引用的对象。

这意味着复制目标很大的std::function将涉及目标的分配和副本(不允许引用计数,因为目标可能具有可变状态)。但是,在您的特定情况下,由于您使用临时值prvalue调用函数,因此将省略该副本。

在您的具体情况下,由于您立即调用该函数,因此无需担心取得它的所有权,因此最好通过const引用来获取该函数。通过右值引用来获取它将使具有现有左值或const引用函数的用户感到头疼;他们需要std::move它(在前一种情况下)或创建一个prvalue临时副本(在后一种情况下)。