为什么C/C++经常需要与汇编语言代码一起使用?
在C/C++中无法完成哪些在混合汇编语言代码时可以实现的操作?
我有一些3D电脑游戏的源代码。其中有很多汇编代码在使用。
为什么C/C++经常需要与汇编语言代码一起使用?
在C/C++中无法完成哪些在混合汇编语言代码时可以实现的操作?
我有一些3D电脑游戏的源代码。其中有很多汇编代码在使用。
以下是我想到的,没有特定顺序:
特殊指令。在嵌入式应用程序中,当DMA传输填充内存缓冲区后,我需要使高速缓存无效。在SH-4 CPU上,唯一的方法是执行特殊指令,因此内联汇编(或独立汇编函数)是唯一的选择。
优化。曾经,编译器并不知道 每个 可能的技巧。在某些情况下,用手工制作的版本替换内部循环是值得的。在小型嵌入式系统(如8051、PIC等所使用的CPU)中,将内部循环转换成汇编代码可能会很有价值。我要强调的是,在现代具有流水线、多发射执行、广泛缓存等功能的处理器上,手写代码往往极难接近优化器的能力。
中断处理。在嵌入式应用程序中,通常需要捕获系统事件,例如中断和异常。通常情况下,中断执行的前几条指令具有特殊职责,确保正确的事情发生的唯一方法是使用汇编语言编写处理程序的外层。例如,在ColdFire(或任何68000的后继者)上,只有第一条指令是保证执行的。为了防止嵌套中断,该指令必须修改中断优先级级别,以屏蔽当前中断的优先级。
操作系统内核的某些部分。例如,任务切换要求保存当前任务的执行状态(至少大多数寄存器,包括PC和堆栈指针),并加载新任务的状态。操纵CPU的执行状态远远超出了语言的功能集,但可以用少量汇编代码来包装,以便可以在C或C++中编写其余的内核代码。
编辑:我修改了关于优化的措辞。让我强调一下,在具有大量用户群体和良好支持的编译器与合理优化功能的目标平台上,汇编编码师无法击败优化器的性能表现。
在尝试之前,先进行仔细的分析以确定瓶颈真正存在的地方。有了这些信息后,仔细检查假设和算法,因为最好的优化通常是找到更好的处理大图景的方法。然后,如果一切都失败了,在测试用例中隔离瓶颈,仔细进行基准测试,并开始汇编调整。
有些事情只能用汇编语言来完成,而不能用C/C++语言实现。
这些包括:
在汇编语言中,您还可以比C/C++更好地优化代码(例如,在Android上,memcpy是用汇编语言编写的)。
为什么在C/C++中经常需要使用汇编语言代码?
竞争优势。比如,如果你正在为即将成为世界第一的游戏公司编写软件。
在C/C++中无法完成什么任务,但混合使用汇编语言代码可以实现?
除非需要达到绝对的性能水平,例如每秒X帧或每秒Y亿个多边形,否则没有任何事情是不可能在C/C++中完成的。
编辑:根据其他回复,似乎嵌入式系统(iPhone、Android等)具有硬件加速器,确实需要使用汇编语言。
我有一些3D电脑游戏的源代码。其中使用了很多汇编代码。
它们要么是在80年代-90年代编写的,要么只在游戏引擎中少量使用(可能占总源代码的1%至5%)。
编辑:到目前为止,编译器自动向量化的质量仍然很差。因此,您可能会看到包含向量化内部函数的程序,由于这与实际编写汇编语言并没有太大区别(大多数内部函数都有一一映射到汇编指令),因此有些人可能会决定使用汇编语言编写。
更新:
根据传闻,RollerCoaster Tycoon 的编写使用了99%的汇编语言。
http://www.chrissawyergames.com/faq3.htm
你的编译器可能还不能生成新的指令,或者编译器效果不佳,或者你需要直接控制CPU。
值得一提的是:
在某些情况下,汇编语言可以比任何编译器生成的代码更加优化。