gpt4 book ai didi

c++ - 如果我在 lambda 函数中使用 [this] 而不是 [=] 是否有任何性能提升?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:06 30 4
gpt4 key购买 nike

据我了解,[=] 复制函数体内使用的所有变量,而 [this] 仅复制 this 指针。但是查看示例,我发现 [=] 被广泛使用,其中 [this][this, foo] 就足够了。是否有任何理由(例如性能提升)使用 [this] 而不是 [=]

最佳答案

没有性能提升,因为正如您所说,只有您在 lambda 中实际使用的变量会被复制用于 [=] 这主要是编码人员的懒惰和保持 lambda 头的简洁。如果您使用新变量,则必须扩展捕获子句以包含这些变量,等等。然而,有时,您希望/必须是明确的,例如当您想要混合按引用和按值捕获时。


† 请注意,目前,以下代码段中的 [=](甚至 [x])不会复制成员变量进入 lambda,与您的预期相反:

struct X{
std::function<void()> f(){
return [=]{ std::cout << "x: " << x << "\n"; };
}

int x;
};

相反,您会得到一份this。如果 lambda 比父对象长,这可能会导致问题,并且要使其正确运行,您目前需要在 f 的主体内创建一个本地名称并捕获/使用它。此名称可以是引用或值。我更喜欢引用,因为它少了一个拷贝(对于引用,成员只会被复制到 lambda 中,而对于值,成员首先被复制到那个,然后再复制到 lambda 中)。

struct X{
std::function<void()> f(){
auto& x_ref = x;
return [=]{ std::cout << "x: " << x_ref << "\n"; };
}

int x;
};

然而,there is a proposal使 [=][member_name] 捕获子句复制成员。如果您需要引用,则需要捕获 [this]


‡ 感谢 @MooingDuck启蒙。

关于c++ - 如果我在 lambda 函数中使用 [this] 而不是 [=] 是否有任何性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13222891/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com