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