这与 frame pointer omitting ? Any risk? 相关但不相同

我正在尝试遵循这篇旧的(但仍然相关的文章)

http://blogs.msdn.com/b/larryosterman/archive/2007/03/12/fpo.aspx

拉里(作者写道)



然而,在进一步讨论中,一位用户写道



我有几个问题。

  • 溢出代码 == 注册溢出?
  • 作者是否正确认为 FPO 通常被认为是一种痛苦和
    yield 不会超过 yield 。
  • FPO 今天在 x64 架构中是否仍然相关,因为有一个
    更多的寄存器 o 玩。
  • 你使用 FPO 吗?什么(如果是),它对
    你?

  • 最后在这篇文章中

    http://www.altdevblogaday.com/2012/05/24/x64-abi-intro-to-the-windows-x64-calling-convention/

    作者说



    优化的构建不会优化多余的分配吗?

    最佳答案



    几乎。严格来说,溢出代码是编译器为实现寄存器溢出而添加的代码。溢出本身是将有效范围标记为无法放入寄存器的决定。



    作者可能是正确的,在现代处理器架构中,FPO 将产生显着性能增益的函数种类比过去少。然而 FPO 确实使代码更小,减少了缓存压力。它们确实减少了注册压力。这些在某些设置中可能很重要。他们确实通过一些指令加速了 prolog 和 epilog 代码。关于调试器在没有 FP 的情况下无法正常工作的观点值得注意。这意味着核心转储对于生产优化代码的事后分析不太有用。除了最终测试之外,您永远不想在开发过程中使用 FPO。



    现代处理器是如此多样和复杂,以至于您在尝试和测量之前几乎永远不知道什么是“相关的”。



    我编写了一个中等大小的 C 库(20K SLOC),它在 gcc 下的总体运行时间有很小(约 5%)的差异。这是必须在 gcc 和 Visual C 下编译的脚本语言的 native 语言扩展。使用它会拆分构建路径。我认为 5% 不值得为了扩展服务的目的。但如果是动态流体模拟来预测天气,那么 5% 可能值(value)数百万美元。决定会有所不同。



    这完全取决于编译器和优化器设计者。从 MS 文档 here 看来,MS 已将 ABI 定义为所有数据都需要主空间,即使它的整个生命周期都花在寄存器中。

    关于optimization - 帧指针优化的使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23528816/

    10-11 19:11