内联回调中用于lambda捕获的内存分配

时间:2018-07-10 19:09:00

标签: c++ memory lambda

在以下人为设计的示例中,我有一个通用函数,该函数将任意lambda作为回调函数,检查一些前提条件,并在满足条件的情况下调用lambda:

template<ApplyF>
void check_valid(CharacterId id, Operation op, ApplyF apply)
{
    auto it = characters_.find(id);
    if (it != characters_.end())
    {
        Character& character = it->second;
        if (character.operation_valid(op))
        {
            apply(character);
        }
    }
}

然后,这使我可以减少样板操作,仅在满足上述先决条件时才调用lambda:

void attack(CharacterId id, CharacterId enemy, double skill, double chance)
{
    check_valid(id, Operation::Attack, [=](Character& character)
                {
                    character.attack(enemy, skill, chance);
                });
};

void harvest(CharacterId id, ResourceId resource, double quantity)
{
    check_valid(id, Operation::Harvest, [=](Character& character)
                {
                    character.harvest(resource, quantity);
                });
};

您可以看到我正在按值捕获lambda中所需的变量。

我还按值将Lambda传递给check_valid

问题:

动态内存分配是我需要担心的吗?

捕获的变量并按值传递lambda会导致动态内存分配吗?

我知道lambda可以被内联,因此在这种用法中,优化者是否会认为捕获只是语言规则的副产品,并且在外部范围内引用变量而不复制任何内容?

0 个答案:

没有答案