“并行”运行语句

2024-04-25 21:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我必须交换两个变量的值,你只需要做的就是

x,y=y,x

我们可以把它看作是两个语句-(x=y)和(y=x)是并行执行的,而不是一个接一个地执行。在

在c++中有什么方法可以达到同样的效果吗?在

注释/编辑:

我希望将这种“平行效应”(如果存在的话)扩展到更复杂的表达式中,比如
ones,twos= (ones ^ n) ^ ~twos, (ones & n) | (twos & ~n);

这在python中是可能的,在c++中可能吗?在

结论:

所以根据leemes给出的答案和对他的回答的评论:

< p > 1。可以在C++ 03或

中使用Boost库。 < P > 2。可以使用C++ 11

访问std::tie和{}以实现这种“并行”效果。 就目前而言,我标记为“强> LeMES <强03”,但我仍在寻找实现C++中的这一酷功能的方法。在


Tags: 方法答案编辑表达式评论ones语句效应
2条回答

如果x和{}是普通整数,那么有多种快速技巧可以在一行中交换它们:

http://cpptruths.blogspot.com/2006/04/swapping-two-integers-in-one-liner.html

特殊情况:交换两个变量的值

(一般解决方案见下文)

在C++中交换两个变量的值,你应该总是使用^{}:< /p>

using std::swap;
swap(x, y);      // Do NOT say:  std::swap(x, y)      Read about Koenig lookup!

不用担心它是如何做到的;它会很快做到的。如果处理器支持它,则C++标准库的实现将尽其所能将其优化为<>强单指令<强>(但标准不告诉实现这样做)。对于仅寄存器变量,例如x86指令^{},它将尽可能快地执行此操作。不要试图用一些“三异或操作”来调整它,它不会更快。如果不走运,它将不会被优化为xchg。在

C++ 03中的通用^ {< CD1>}操作引入临时变量并执行三个副本结构。在C++ 11中有移动语义,对象比复制的对象移动得多。对于您的自己的类型,假设某些数据结构只保存一个指向实际数据的指针,您应该优化此过程,使其在恒定时间内执行:

    < > >强> > C++ 03 <强>中,你可以在{ {3} } }中专门化或在命名空间(see the two top answers on this question)中实现自己的^ {{CD1>}函数以优化交换:只需交换类中的每个成员来交换它们的数据。对于只保存指针的数据结构示例,只需交换指针即可。

    < > >强> >在C++ 11 中,有了新的移动语义,它允许你实现数据从一个对象到另一个对象的移动,这将导致一个非常相似的行为。(移动语义是针对诸如交换两个对象这样的更一般的问题引入的:如果不再需要一个对象,但另一个对象必须是第一个对象的“副本”,则可以简单地移动它。)有关移动语义和移动构造函数的详细信息,请阅读。

    <> L>>C++ 03和C++ 11 < /强>有一种替代方法:可以实现隐式共享数据重写类EME>重数据结构类。在上面的示例中,如果数据结构包含指向实际数据的指针,则实现引用计数。复制数据结构时,只需将引用计数器增加一。修改数据时,请确保它不是共享的(ref count=1),否则只通过复制来“分离”它。这将导致恒定时间的复制和交换操作。


一般情况:多个任意表达式

对于其他不依赖于输入/输出的语句,如(a, b) = (x, y),只需“原样”编写它们,并且它至少可以完美地流水线运行,因为它们没有任何依赖关系:

^{pr2}$

如果你可以把输入分成两部分。你不会帮自己一个忙,试图用一些花哨的表达技巧,如异或。编译器知道汇编程序的许多技巧(如^ {CD2}}),你只知道在普通C++中表达这种技巧(如XOR)。在

<>在C++ 11中,有{{CD9>}和^{},允许您在不引入临时变量的情况下分配多个表达式(它们将被引入到后台以保存元组中存储的值,并试图完全地将它们优化或至少仅使用寄存器来保存它们):

using std::tie;
using std::make_tuple;
tie(ones, twos) = make_tuple((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));

请注意,右侧对/元组的类型必须与左侧的目标值匹配,因为这里的转换不是隐式的。如果遇到问题,请在右侧执行static_cast,告诉std::make_tuple显式类型,或者只对需要显式类型的std::tuple使用构造函数,例如:

using std::tie;
using std::tuple;
tie(ones, twos) = tuple<int,int>((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n));

相关问题 更多 >