2016-02-12 53 views

回答

6

没有指定C++标准应该做什么。但我会说任何体面的编译器都会优化这些代码,甚至不会留下nop指令。

2

现代编译器为了某种目的发出类似nop的指令 - 通常用于对齐(在许多架构中,如果目标与16字节对齐,分支会更快地执行)或等待某些操作完成(IARC上的IIRC你必须在使用某些操作码的结果之前等待一定数量的周期,所以要么你有其他的事情要做,要么你必须发射nop s)。

现在,无论我们是在这种情况下还是最有可能没有nop将被发射。对于这样的函数,您可以期待定期的堆栈框架设置,随后清理未优化的版本,或者在优化过的版本中使用普通的ret(加上堆栈清理代码,如果调用约定规定的话)。更好的是,如果编译器足够智能并且在编译呼叫站点时已知函数的定义(所以,这是一个static函数,启用了一个inline或启用链接时间码生成),则该呼叫可能是完全省略,并且可能在最终的可执行文件中没有保留功能代码的踪迹。