c++ - 我应该预防性地 move 可调用对象(例如 lambda 吗?)

标签 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;
}

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

最佳答案

您的 lambda 仅具有引用捕获。 move 左值引用与复制它的作用完全相同。如果您有[=]捕获,则该 move 实际上会执行一些操作。

一般情况下是否这样做的答案是:“视情况而定”。 W.r.t.性能:测量。

关于c++ - 我应该预防性地 move 可调用对象(例如 lambda 吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74560021/

相关文章:

c++ - 将文件中的行输入到 char 数组中

c++ - 重载引用转换

c++ - 使用 move 作为线程 vector 的自定义分配器

c++ - 编译器是否优化 C++ 中静态值的 if 语句

c++ - 'A' 的整数值

java - 我在 java 8 lambda Predicate<Integer> 上做错了什么?

C# - 初始化程序中类字段的闭包?

c++ - 是否可以使 lambda 签名中的模板变量通用?

rust - Rust 的所有权语义如何与 Clean 和 Mercury 中发现的唯一性类型相关?

c++ - 如果没有带有函数签名的右值参数,是否会执行 C++ 11 中的 Move Semantic?