为什么编译和链接的高级语言执行得比汇编/机器代码慢?

Din*_*awz 0 c binary-files

假设我将 C 编译并链接到平面二进制文件或某些可执行输出格式以在裸机上运行。如果我在启动时优化并直接将二进制文件提供给 CPU,为什么结果格式会从编译和链接的 C 源中花费更多的时钟周期而不是汇编?我的意思是,如果从某种二进制格式提供和获取相同的指令,无论其来源如何,如果生成的二进制文件产生相同的操作码,无论是来自 C、D、汇编还是直接编写的操作码本身(如果可能),为什么程序员经常说汇编总是更快吗?

抱歉,如果不清楚,但总的来说,如果二进制文件只包含必要的指令(和一个链接器脚本或输出格式处理程序可以为 C 或其他语言执行此操作,它应该同样快)。

Ken*_*Ken 6

你的前提是错误的。如果您使用高级语言编译为与手工汇编器完全相同的操作码的平面二进制文件,那么该程序将执行完全相同的。问题是,这些情况从未真正发生过。

每个 C 程序在开始时都有引导代码(在你进入主程序之前),所以马上就有额外的操作码。如果您调用一个函数,C 调用约定可能不如专门的程序集调用优化,后者可能因函数而异。最后,编译器在任何给定函数中生成的操作码与手工汇编器不同;有时更好有时更糟,这取决于编译器编写者与汇编程序员的能力。所以“组装总是更好”也不是真的。

例如,编译器可能会展开循环以使其更快。在汇编程序中,你可以用宏做同样的事情;但是汇编程序员会遇到那个麻烦吗?