想知道空表达式是否评估为NOP或者它是否依赖于编译器。
// Trivial example
int main()
{
;;
}
答案 0 :(得分:6)
它依赖于编译器,但可观察的行为必须是没有任何反应。在实践中,我确信大多数编译器都会省略任何代码都没有空表达。
执行格式良好的程序的符合实现应该产生与具有相同程序和相同输入的抽象机器的相应实例的可能执行之一相同的可观察行为。
可观察行为的定义是:
符合实施的最低要求是:
- 严格按照抽象机的规则评估对volatile对象的访问。
- 在程序终止时,写入文件的所有数据应与根据抽象语义生成的程序执行的可能结果之一相同。
- 交互式设备的输入和输出动态应以在程序等待输入之前提示输出实际传送的方式进行。构成交互设备的是实现定义的。
这些统称为程序的可观察行为。
这实际上是实现的唯一要求。它通常被称为“as-if”规则 - 只要可观察行为符合预期,编译器就可以做任何喜欢的事情。
对于它的价值,这些空表达式称为 null语句:
表达式为missing的表达式语句称为空语句。
如果你真的想要一个NOP,你可以尝试:
asm("nop");
但是,这是有条件支持的,其行为是实现定义的。
答案 1 :(得分:1)
或者它是否依赖于编译器。
它依赖于编译器(“as-if规则”),但是为了提高效率,大多数合理的优化编译器都会忽略空语句,并且它们通常不会发出NOP
指令。