通常在C中,我们将语句作为列表,并且在程序运行时,它逐个执行语句。是否可以同时执行两个语句?
例如,假设我希望交换两个变量a
和b
。通常我们会声明第三个变量c
。
c=b;
b=a;
a=b;
但如果我们能够同时执行两个语句,那么我们就不需要第三个变量c
。我们可以同时执行a=b;
和b=a;
。
那么,有没有办法同时同时执行两个或多个语句?
答案 0 :(得分:8)
语句"当程序运行时,它逐个执行语句" 表明你从根本上误解了C编程语言。
C标准说需要执行已编译的程序,以便程序的副作用按as if顺序发生,这些语句在C abstract machine中执行对抽象机器的规则。但是,为非volatile
变量分配值并不算作此类副作用,即在您的程序中
c = b;
b = a;
a = c; // notice, it is *c* here
由于没有任何语句具有任何可见的副作用,编译器可以自由地重新组织,交错和消除这些语句,只要它不会改变任何先前或后续的副作用或它们的相对排序。
在实践中,任何体面的编译器都会注意到这是一个交换操作,并且它会使用一个汇编程序操作码对此进行编码,例如x86 XCHG
,即使C编程语言没有本身就有一个交换操作。或者,可能是这些生成零操作码,编译器只记得"今后b
应称为a
和{{1} } a
。"
实际上强制编译器生成一个严格顺序执行每个语句的程序的唯一方法是,如果每个语句都触及一个变量,那么b
- 合格,因为访问volatile
限定对象被视为副作用。
答案 1 :(得分:4)
您可以在C中创建多个线程(使用libpthreads),如果您有多核CPU,则可以同时执行线程。
您的示例的问题是数据相互依赖。您将创建一个race condition。
如果你想在没有中间变量的情况下交换两个变量,可以使用XOR swap algorithm,但效率低于仅使用中间变量。
答案 2 :(得分:3)
有多线程,但无论你说什么都不可能,因为这两个语句之间存在数据依赖性。
同时执行2将永远不会给出合理的结果。
您可以做的是识别程序的不同独立部分,然后在不同的线程中执行它们。从程序员的角度来看,这是你可以达到的并行度。
答案 3 :(得分:1)
那么,有没有办法同时同时执行两个或多个语句?
是的,通过多线程。
尽管如此,你需要同时运行两个线程,以达到这个效果。
一般情况下,我们不会同时执行同时执行的语句,但这样做太难了,而且它的收益根本不值得。
但是,在您的情况下,它会导致数据竞争。
PS:您可以在没有临时值的情况下交换数字,就像我描述here。
答案 4 :(得分:1)
c中的语句按顺序执行,除非您在代码中使用break或continue标签。 在您指定的示例中,您无法同时执行语句。 如果您不想使用临时变量,那么您可以使用此逻辑。
a = a+b;
a = a-b;
b = a-b;
答案 5 :(得分:0)
使用SIMD指令,如果数据适合,可以同时执行多个语句(矢量化)。
示例:
a = e + g * ...
b = f + g * ...
c = e + g * ...
d = f + g * ...
答案 6 :(得分:0)
无论您如何对其进行分片,CPU都必须在b
被覆盖之前将a
的值保留在临时位置,因此可以在分配中再次使用它另一个变量。甚至像Python这样的允许你说a,b=b,a
的语言实际上也会产生这些临时变量。
有几个人提到"线程"在其他答案。在这一点上,鉴于你问的问题的性质,我强烈建议你不要追求。 (你还没有为线程做好准备!)使用线程进行简单的变量交换是非常不寻常的,并且只有在考虑更多竞争条件的情况下才会变慢。
如果您正在寻找表达" swap"的简写方式,您可以随时定义自己的宏。
#define SWAP(x,y) {auto tmp=x; x=y; y=tmp;}
然后你可以用你自己的代码说SWAP(a,b)
。