有什么是我们可以在汇编中做但在原始 C 中不能做的吗?或者有什么在组装中更容易做的事情吗?是否有任何现代代码实际上是使用内联汇编编写的,或者它只是作为遗留或教育功能实现?
内联汇编(以及相关说明,调用纯粹用汇编语言编写的外部函数)可能非常有用或绝对必要,原因包括编写设备驱动程序、直接访问语言中未定义的硬件或处理器功能、硬件支持的并行处理(相对于多线程)例如 CUDA、与 FPGA 的接口、性能等。
它也很重要,因为有些事情只有在标准(C++ 和 C)提供的抽象级别“之下”才可能实现。
标准认识到有些事情本质上是由实现定义的,并在整个标准中允许这一点。这些津贴之一(也许是最低级别)是承认asm
。嗯,“有点”认可:
在 C (N1256) 中,可以在标准的“通用扩展”下找到它:
J.5.10 asm 关键字
1 asm 关键字可用于将汇编语言直接插入到翻译器输出中 (6.8)。最常见的实现是通过以下形式的语句:
asm(字符串文字);
在 C++ (N3337) 中,它有类似的警告:
§7.4/1
asm 声明的形式为
asm 定义:
asm ( 字符串文字 ) ;
asm 声明是有条件支持的;它的含义是由实现定义的。 [ 注意:通常它用于通过实现将信息传递给汇编器。 ——尾注]
应该指出的是,近年来的一个重要发展是,尝试通过使用内联汇编来提高性能通常会适得其反,除非您知道exactly你在做什么。编译器/优化器寄存器使用决策、管道意识和分支预测行为等对于大多数用途来说几乎总是足够的。
另一方面,近年来的处理器增加了对更高级别操作的CPU级别支持(例如Intel的AES扩展),可以将专门应用程序的性能提高几个数量级。
So:
遗留功能?一点也不。对于某些要求来说这是绝对必要的。
教育特色?在理想的世界中,只有伴随一系列讲座来解释为什么您可能永远不需要它,以及如果您确实需要它,如何尽可能地将其可见表面积限制在应用程序的其余部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)