将即时返回函数调用编译为" nop"指令?

时间:2016-02-12 17:53:16

标签: c++ c assembly compilation

说我有一个功能:

checkBoxWC = (CheckBox)findViewById(R.id.WCcheckBox);
checkBoxC = (CheckBox)findViewById(R.id.CcheckBox);

这会编译成void foo ( int bar ){ return; } 指令吗?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

现代编译器为某些目的发出nop - 就像指令一样 - 通常用于对齐(如果目标与 - 例如 - 16字节对齐,许多架构分支上执行得更快)或者等待某些操作完成(在IA64上的IIRC,你必须等待一些循环才能使用某些操作码的结果,所以要么你还有别的事要做,要么你必须发出nop s)。

现在,要么我们处于这种情况,要么很可能不会发出nop。对于这样的函数,您可以期望常规堆栈框架设置,然后是非优化版本的清理,或者是优化版本中的普通ret(加上调用约定强制执行的堆栈清理代码)。

更好的是,如果编译器足够智能并且在编译调用站点时已知该函数的定义(因此,这是一个static函数,inline一个或链接时间代码生成启用)可以完全省略调用,并且最终可执行文件中可能没有任何功能代码的痕迹。

相关问题