【发布时间】:2021-11-16 19:28:23
【问题描述】:
我想我们都知道如何交换值,但还有另一种方法:
constexpr auto assign(auto& ...a) noexcept
{
return [&](auto const ...v) noexcept { ((a = v), ...); };
}
要交换,我们需要调用assign(a, b)(b, a)。
这是交换基本类型值的有效方法吗?它是否提供了比通常方式更多的优化空间?
【问题讨论】:
-
我以前从未见过这个“成语”,我不喜欢它:( 谷歌搜索“assign idiom”只能找到这个问题,所以看起来像是你编的。@ 987654321@
-
这很难阅读,并且似乎复制了所有值两次(标准交换复制一个值两次,另一个值(“其余”)一次)。好处应该在哪里?
-
@JohnBayko:可能。那也可以be done with
std::tie。 -
我的测试产生了相同的程序集。如果您在基准测试中有一个有趣的结果,请与我们分享,正如@HolyBlackCat 建议的那样。否则,我想我的答案是我们所能提供的。
-
"trustimplicity without ... asm" Here's the asm,(几乎)所有三种方法都相同。