我应该预防性地移动可调用对象(例如 lambda 吗?)

gla*_*des 2 c++ lambda move-semantics

我有一个计时器的精简示例,我希望可以使用任何类型的可调用来实例化它。为了提高效率,是否建议预防性地将可调用对象移至数据成员中?

#include <concepts>
#include <cstdio>
#include <string>
#include <utility>

template <std::invocable Cb>
class timer {
public:
    timer(Cb cb)
        : cb_ { std::move(cb) }
    {
    }

    auto call()
    {
        cb_();
    }

private:
    Cb cb_;
};

int main()
{
    std::string something_to_print = "Hello World!\n";
    timer some_timer([&]() { printf(something_to_print.c_str()); });
    some_timer.call();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果移动或复制 lambda,我看不到程序集有任何差异。它有什么区别吗?

bit*_*ask 5

您的 lambda 仅具有参考捕获。移动左值引用与复制它的作用完全相同。如果你有[=]捕获,这个举动实际上会产生一些作用。

是否这样做的答案一般是:“视情况而定”。Wrt 性能:测量。