【发布时间】:2020-08-25 22:58:12
【问题描述】:
我想知道 C++ 中是否有一些我还不知道的工具可以在以下简单示例中最小化我的对象和函数的范围,其中我用随机骰子滚动填充向量:
std::vector<int> dice_samples(10);
std::mt19937_64 m_gen;
std::uniform_int_distribution<int> dist(1, 6);
std::generate(dice_sample.begin(), dice_sample.end(), [&](){
return dist(m_gen);
});
理想情况下,我希望生成器和分发都在生成调用范围内。我可以将它们的构造移到 lambda 表达式中,但这样的事情似乎效率极低,因为我将在每次调用时构造一个生成器和分布:
std::vector<int> dice_samples(10);
std::generate(dice_sample.begin(), dice_sample.end(), [](){
std::mt19937_64 m_gen;
std::uniform_int_distribution<int> dist(1, 6);
return dist(m_gen);
});
换句话说,有没有办法在函数调用或 lambda 表达式中确定对象的构造和销毁范围?还是在最新版本的 C++ 中还不能做到这一点?
【问题讨论】:
-
你知道,我从未尝试在 lambda 中定义
static变量。我想我有一些新的东西要查找。 How do static variables in lambda function objects work? 似乎回答了这个问题。看起来你可以使用static。 -
@user4581301 我做了,但主要是作为一些计数器,而不是捕获外部计数器。可能会与通用 lambda 混淆.. 它们被视为模板
-
@Swift-FridayPie 你可能是对的。上面链接中的评论警告了这一点。不过,对于像这样的微不足道的情况,这应该不是问题。
-
@user4571391 有趣我以前也从未想过在 lambda 中使用静态。我想知道在这种情况下使用静态的性能损失(如果有的话)是否值得。
-
请注意,上面的思考可能对提问者无用。访问的范围很好,但 RNG 变量的生命周期可能很长。傻瓜们将一直参与该计划。
标签: c++ optimization