为什么C中没有内置交换功能但是汇编中有xchg?

Jay*_*ita 4 c assembly

最近我遇到了汇编语言.x86程序集有一个xchg指令,用于交换两个寄存器的内容.

由于每个C代码都首先转换为汇编代码,如果在C中像在标题中一样内置了交换函数,那就太好了stdio.h.然后,只要编译器检测到交换函数,它就可以在汇编文件中添加xchg指令.

那么为什么这个交换功能没有在C中实现呢?

Eug*_*Sh. 7

C是一种跨平台语言.装配是特定于架构的.并非每个架构都有这样的指令.而且,作为高级语言的C不必与机器级指令集和功能相对应,因为它的目的是在"人"语言和机器语言之间架起桥梁,而不是模仿它.据说,针对此特定体系结构的C编译器可能具有此交换指令的扩展,或者如果足够智能则优化交换代码以使用此指令.

  • @ zx485嗯,我想如果有足够的支持者,它会在某些时候进入标准. (4认同)
  • 语言功能不必与每个体系结构所具有的结构相对应.您可以在没有浮点硬件的架构上实现C,而是在软件中完成. (2认同)

use*_*290 5

这适用于适合寄存器并位于寄存器中的变量.它不适用于内存中保存的大型结构或变量(如果在reg X中加载变量A,在reg Y中加上B,并交换它们,则可以跳过交换并直接在Y和B中加载A ).

话虽如此,没有什么能阻止编译器使用交换指令进行编译:

 int a;
 int b;
 int tmp;
 tmp=a;
 a=b;
 b=tmp;
Run Code Online (Sandbox Code Playgroud)

...如果那些恰好在寄存器中:事实上它不在C中并不意味着编译器不使用它.


cma*_*ter 5

有两点可以解释为什么swap()不在C中

1.函数调用语义:
包括一个swap()函数将破坏C语言中的一个非常基本的设计决策:swap()只能使用传递引用语义(C ++已添加到语言中,但在C语言中不存在),而不能使用传递语义-值。

2.可用汇编程序指令的多样性
除此之外,在任何给定的CPU体系结构上通常都有大量的汇编程序指令,而从纯C语言完全无法访问这些指令。这包括各种指令,例如中断处理指令,虚拟内存空间操作指令, / O指令,摆弄指令(在PPC指令上搜索rlwimi,以获取更强大的示例)等。

根本不可能在通用语言(例如C)中包含大量此类代码。

其中一些对于实现操作系统至关重要,这就是为什么任何OS至少都必须包含少量汇编代码的原因。它们通常使用内联汇编器封装在某些函数中,或在内核头文件中定义为预处理器指令。其他指令不太重要,或者仅对优化有用,这些指令可能是通过优化编译器生成的,许多编译器的确会生成它们(向量函数的整个类都属于此类)。

面对如此众多的多样性,C的设计师只需要将其削减到某个地方即可。他们选择提供任何可表示为简单运算符的东西,例如(+,-,〜,&,|,!,&&,||等),但没有提供任何需要函数调用语法的内容,例如swap()您建议的函数。