我应该通过值传递std::函数还是通过(rvvalue)-引用传递函数



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

通过值传递还是通过引用传递更有效?

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

按价值:

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

按右值参考:

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

首先,当目标是std::reference_wrapper的函数指针时,需要std::function来避免分配;鼓励实施以避免分配给"小"目标:

[…]例如,其中f的目标是一个对象,该对象只包含一个指针或对对象的引用以及一个成员函数指针。

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

在您的特定情况下,由于您要立即调用该函数,因此不需要担心获取它的所有权,因此最好通过const引用获取该函数。通过右值引用获取它会让对函数有现有左值或常量引用的用户感到头疼;他们将需要CCD_ 6 it(在前一种情况下)或创建prvalue临时副本(在后一种情况中)。

最新更新