我不太明白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; });
答案 0 :(得分:6)
首先,在目标是std::function
的函数指针的情况下,需要std::reference_wrapper
来避免分配;实现是encouraged to avoid allocation for "small" targets:
例如,[...]其中
f
的目标是一个只包含对象和成员函数指针的指针或引用的对象。
这意味着复制目标很大的std::function
将涉及目标的分配和副本(不允许引用计数,因为目标可能具有可变状态)。但是,在您的特定情况下,由于您使用临时值prvalue调用函数,因此将省略该副本。
在您的具体情况下,由于您立即调用该函数,因此无需担心取得它的所有权,因此最好通过const引用来获取该函数。通过右值引用来获取它将使具有现有左值或const引用函数的用户感到头疼;他们需要std::move
它(在前一种情况下)或创建一个prvalue临时副本(在后一种情况下)。