我有一个计时器的精简示例,我希望可以使用任何类型的可调用来实例化它。为了提高效率,是否建议预防性地将可调用对象移至数据成员中?
#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;
}
如果我 move 或复制 lambda,我在程序集中看不到任何差异。它有什么区别吗?
最佳答案
您的 lambda 仅具有引用捕获。 move 左值引用与复制它的作用完全相同。如果您有[=]
捕获,则该 move 实际上会执行一些操作。
一般情况下是否这样做的答案是:“视情况而定”。 W.r.t.性能:测量。
关于c++ - 我应该预防性地 move 可调用对象(例如 lambda 吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74560021/