while(a==b); vs while(a==b) {;}

3
以下两段代码有什么区别:
  1. while (a==b);
  2. while (a==b) {;}
这会对编译器或执行时间产生影响吗? 此问题的背景是:目前FW使用代码1,其中a或b实际上是全局变量,FW在特定核心中挂起/等待,直到另一个核心使条件成真。我们想在SystemC中模拟此代码,但这个“无限”while循环不在SystemC上下文中,因此SystemC调度程序将不知道该线程正在等待另一个线程,导致死锁。 因此,我们想用以下代码替换原来的代码:while (a==b) {CONTEXT_SWITCH(1);} 目标构建如下:
#define CONTEXT_SWITCH(x)

对于 SystemC 构建,我们有:

#define CONTEXT_SWITCH(x)   wait(x) //where wait is a systemC wait

在目标构建的情况下,此代码将变为代码2。想知道这是否会对性能产生影响?


为什么要写 while (a==b) {;} 而不是 while (a==b) {}?如果前者太慢,你可以尝试后者 :) 但说真的,两者没有区别。无论它是否会产生影响(如果你的编译器表现不同)- 只有你自己知道。 - AnT stands with Russia
4个回答

8

它会影响编译器或执行时间吗?

不会。这两种写法是完全一样的。在运行时没有任何差异,编译时间的差异也可以忽略不计,因为解析 {;} 的时间微乎其微。

如果你必须选择其中一种,那么选择对你自己意图更明确的。


1
我总是会选择使用 {;} 而不是单独使用 ;,因为前者看起来像是有意为之,而后者则像是一个无限循环的意外,你不知道为什么会出现这种情况。 - SinisterMJ
@subtle85: 很高兴我能帮到你。如果这回答了你的问题,请考虑将它标记为已接受的答案(或者你可能更喜欢不同用户的其他答案)。 - Andy Prowl

1
一个好的主流编译器会生成完全相同的汇编代码。因此,实际运行时性能没有区别。选择哪个编译器是一个观念问题。选择符合你所需编码标准的编译器即可。

即使是世界上最愚蠢、最天真的编译器,也应该为这两个结构生成相同的汇编代码,因为它们在语法和语义上是完全相同的。 - This isn't my real name

0

不会对性能产生任何影响。

花括号本身并不会生成代码。编译器使用它们来确定复合语句的开始和结束,除此之外没有其他作用。对于编译器来说,复合语句和单个语句的处理方式是相同的 - 花括号只是让编译器知道你想要将什么作为 while 循环的语句。


0

当我们写while(a==b);时,两者的执行时间是相同的。编译器会在内部将其转换为while(a==b){;}。因此,你以哪种形式编写它并不重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,