Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 帧指针优化的使用_Optimization_Assembly - Fatal编程技术网

Optimization 帧指针优化的使用

Optimization 帧指针优化的使用,optimization,assembly,Optimization,Assembly,这是相关的,但与 我正在努力学习这篇老文章(但仍然是相关文章) 拉里(作者写道) 自1995年以来,机器的速度大大加快,性能 FPO实现的改进不足以应对 FPO带来的调试和分析之痛 然而,在接下来的讨论中,一位用户写道 禁用FPO可能会严重影响代码大小和性能。 当帧指针被激活时,必须禁用尾部调用优化 存在,导致受影响路径中的堆栈使用量大大增加。小的 函数也不成比例地受到prolog/epilog代码的影响。 第三,尽管一个帧仍有六个寄存器可用 X86上的指针,其中只有三个相对于 嵌套调用:EB

这是相关的,但与

我正在努力学习这篇老文章(但仍然是相关文章)

拉里(作者写道)

自1995年以来,机器的速度大大加快,性能 FPO实现的改进不足以应对 FPO带来的调试和分析之痛

然而,在接下来的讨论中,一位用户写道

禁用FPO可能会严重影响代码大小和性能。 当帧指针被激活时,必须禁用尾部调用优化 存在,导致受影响路径中的堆栈使用量大大增加。小的 函数也不成比例地受到prolog/epilog代码的影响。 第三,尽管一个帧仍有六个寄存器可用 X86上的指针,其中只有三个相对于 嵌套调用:EBX、ESI和EDI。打开第四个寄存器可能会降低 一堆泄漏代码

我有几个问题

  • 溢出代码==注册溢出
  • 作者是否正确地认为FPO通常被认为是一种痛苦和痛苦 收益并不超过收益
  • FPO在x64体系结构中是否仍然相关,因为存在 更多的寄存器可以玩
  • 你使用FPO吗?为什么(如果是的话)以及这对 你呢
  • 最后在本文中

    作者说

    [遵循Windows x64调用约定]

    所有参数都在堆栈上保留了空间,即使是在寄存器中传递的参数也是如此。实际上,有4个参数的堆栈空间 即使你的函数没有任何参数。这些参数是8 字节,因此每个函数的堆栈上至少有32个字节 (每个函数实际上在堆栈上至少有48个字节…我将 请下次再解释)。此堆栈区域称为主空间。 在这个家庭空间背后有几个原因:

  • 如果寄存器需要用于其他用途,则被调用的函数可以在不移动堆栈的情况下将数据存储在主空间中 指针
  • 它使堆栈结构易于确定。这对于调试非常方便,并且对于x64的堆栈元数据(另一个)可能是必需的 点我会回到另一个时间)。。。。。。编译器可以使用它 无论它想要什么,一个优化的构建可能会带来巨大的好处 使用它
  • 优化的构建不会优化多余的分配吗?

    1)当您需要使用一个寄存器而没有任何未使用的寄存器时,您需要编写代码在堆栈上保存一些寄存器值,然后还原它

    2) 当退绕主要是通过在堆栈上行走来完成时,FPO是一种痛苦。如今,标准的解卷ABI仍然存在(例如,为了启用异常处理),因此信息已经存在,并且组织起来更有效(远离热代码),因此不存在任何问题。当然,如果您手工编写所有的机器代码,会有一些痛苦,但这不是典型的用例

    3) 典型的x86_64 ABI根本不使用帧指针(除非绝对必要,如C中的可变长度数组)

    4) 我不是编译器。我的编译器不生成帧指针

    优化过剩)不确定你的问题是什么。住宅区的空间消耗不是问题。不必调整任何堆栈指针的好处是一个很大的优势,因为您需要的代码要少得多。堆栈框架之外的红色区域也是如此,它允许叶代码使用大量内存,而不需要任何堆栈指针

    1.溢出代码==登记溢出

    差不多。严格地说,溢出代码是编译器为实现寄存器溢出而添加的代码。泄漏本身就是决定将活动范围标记为无法放置在登记簿中

    2.作者是否正确地认为FPO通常被认为是一种痛苦,而收益并不超过收益

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

    3.FPO在x64体系结构中仍然适用,因为有更多寄存器可供使用

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

    4.你们使用FPO吗?为什么(如果是),这对你有影响吗

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

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


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

    好问题,虽然它可能是以观点为基础的。谢谢…我后来意识到有些是以观点为基础的,但有些是以事实/经验为基础的。谢谢