编译后ASM优化丢失了吗?

Atm*_*ons 2 c++ optimization assembly

不是说我现在处于那种情况,但我只是对答案感兴趣......

假设你有一些用C/C++编写的代码,你想通过在ASM中修改它来手动优化它.

如果您在C/C++中更改代码并从源代码重新编译,会发生什么.当然,刚编译文件的优化会丢失.您如何避免每次编译项目时都需要重做这些优化?您是否为需要优化的部件创建单独的源文件以使其不那么复杂?或者是否有某种自动工具来做到这一点......?猜猜你不能使用diff/patch这个......

请分享您的经验,谢谢

Tar*_*don 7

您可以在单独的ASM文件中编写一些函数,并从C/C++代码中调用这些函数.或者直接在C/C++代码中编写内联汇编.

换句话说,您可以从一些C/C++代码开始获取一些基本的ASM代码,但是在开始调整它之后,您将使用这两种方法之一删除原始C/C++代码并将其替换为您的ASM代码.

  • 好吧,euh,你把它们放在ifdef下用来验证问题是否到达,或突然不得不移植到另一个拱门 (3认同)

Kor*_*icz 7

为什么不在内联汇编程序中重写代码的关键部分,而不是修改输出?如何做到这一点的方法因编译器而异 - 请查看编译器文档.

在MSVC中:

// asm_overview.cpp
// processor: x86
void __declspec(naked) main()
{
    // Naked functions must provide their own prolog...
    __asm {
        push ebp
        mov ebp, esp
        sub esp, __LOCAL_SIZE
    }

    // ... and epilog
    __asm {
        pop ebp
        ret
    }
}
Run Code Online (Sandbox Code Playgroud)

在GCC:

 __asm__ ("movl %eax, %ebx\n\t"
          "movl $56, %esi\n\t"
          "movl %ecx, $label(%edx,%ebx,$4)\n\t"
          "movb %ah, (%ebx)");
Run Code Online (Sandbox Code Playgroud)

另请注意,在编译和优化之后进行ASM更改只适用于那些完全了解他们正在做什么的人.编译器不仅以人类无法实现的方式优化结构(至少不是没有照明计算器能力的人),它还执行了我们可以做的更复杂的代码分析.

相信你的编译器.这是你曾经使用的最好的工具;).