gpt4 book ai didi

c++ - 在 'parallel'中运行语句

转载 作者:太空狗 更新时间:2023-10-29 20:39:53 26 4
gpt4 key购买 nike

在python中,我不得不交换2个变量的值,您要做的就是

x,y=y,x

可以将其视为两个语句-(x = y)和(y = x)并行执行,而不是一个接一个地执行。

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

注意/编辑:

我希望将此“平行效应”(如果存在)扩展到更复杂的表达式,例如 ones,twos= (ones ^ n) ^ ~twos, (ones & n) | (twos & ~n);
这在python中是可能的,在c++中是否可能?

结论:

因此,根据 leemes 给出的答案以及对他的答案的评论:

1,您可以在C++ 03或更高版本中使用boost库

2,你可以使用C++ 11

访问 std::tiestd::tuple以实现这种“并行”效果。
就目前而言,我将 leemes 回答标记为已接受,但我仍将寻找在C++ 03中实现此炫酷功能的方法。

最佳答案

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

(有关一般解决方案,请参见下文。)

要在C++中交换两个变量的值,应始终使用 swap :

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

不要理会它会如何做。它将很快完成。如果处理器支持,C++标准库的实现将尽其所能将其优化为 单个指令(但是该标准并未告知实现者这样做)。对于仅寄存器变量,例如有x86指令 xchg ,它将尽可能快地执行该操作。不要尝试通过“三个异或运算”来调整它,它不会更快。如果您不走运,则不会将其优化为 xchg之类的东西。

C++ 03中的通用 swap操作引入了一个临时变量并执行了三个拷贝构造。在C++ 11中,有移动语义,对象是移动而不是复制。对于您的 自己的类型,假设某些数据结构仅包含指向实际数据的指针,则应优化此过程以使其在恒定时间内执行:
  • 在C++ 03 中,您可以专用于std::swap或在 namespace (see the two top answers on this question)中实现自己的swap函数以优化交换:只需交换类中的每个成员即可交换其数据。对于仅持有一个指针的数据结构示例,只需交换指针即可。
  • 在C++ 11 中,有新的move语义,它允许您实现数据从一个对象到另一个对象的移动,这将导致非常相似的行为。 (已经针对诸如交换两个对象之类的更一般的问题引入了移动语义:如果不再需要一个对象,但是另一个对象必须是第一个对象的“拷贝”,则可以简单地将其移动。)移动构造函数以获取详细信息。
  • 对于C++ 03和C++ 11 的,都有另一种方法:您可以实现隐式共享数据并为诸如数据结构之类的重类实现写时复制。在上面的示例中,您的数据结构包含指向实际数据的指针,请实现引用计数。复制数据结构时,只需将引用计数器增加1。修改数据时,请确保不共享数据(引用计数= 1),否则仅通过复制数据来“分离”它。这导致了恒定时间的 copy-and-swap 操作。


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

    对于其他不依赖输入/输出的语句,例如(a, b) = (x, y),只需按原样编写它们,由于它们没有任何依赖关系,它将至少以完美的流水线方式运行:
    a = x;
    b = y;

    如果它们是依赖于输入/输出的,例如您在编辑中的示例,则可以将其拆分并引入临时变量。您将无法尝试通过诸如xor-ing之类的奇特表达技巧解决此类问题。编译器知道很多关于汇编器的技巧(例如xchg),您只知道在纯C++中表达这种技巧(例如xor)。

    在C++ 11中,有std::tuple std::tie 允许您分配多个表达式而无需引入临时变量(它们将在后台引入,以保存存储在元组中的值,并尝试完全或至少仅使用寄存器来优化它们)如果可能的话,将它们握住):
    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));

    关于c++ - 在 'parallel'中运行语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14785612/

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