【问题标题】:Will an instant return function call compile to a "nop" instruction? [closed]即时返回函数调用会编译为“nop”指令吗? [关闭]
【发布时间】:2016-02-12 17:53:15
【问题描述】:

假设我有一个函数:

void foo ( int bar ){
    return;
}

这会编译成nop 指令吗?

【问题讨论】:

标签: c++ c assembly compilation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    现代编译器出于某些目的发出类似nop 的指令 - 通常用于对齐(在许多架构上,如果目标对齐到 - 比如说 - 16 字节,分支会更快地执行)或等待某些操作完成(IIRC on IA64 你必须在使用某些操作码的结果之前等待一些周期,所以要么你有别的事情要做,要么你必须发出nops)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多