最近我遇到了汇编语言.x86程序集有一个xchg指令,用于交换两个寄存器的内容.
由于每个C代码都首先转换为汇编代码,如果在C中像在标题中一样内置了交换函数,那就太好了stdio.h.然后,只要编译器检测到交换函数,它就可以在汇编文件中添加xchg指令.
那么为什么这个交换功能没有在C中实现呢?
C是一种跨平台语言.装配是特定于架构的.并非每个架构都有这样的指令.而且,作为高级语言的C不必与机器级指令集和功能相对应,因为它的目的是在"人"语言和机器语言之间架起桥梁,而不是模仿它.据说,针对此特定体系结构的C编译器可能具有此交换指令的扩展,或者如果足够智能则优化交换代码以使用此指令.
这适用于适合寄存器并位于寄存器中的变量.它不适用于内存中保存的大型结构或变量(如果在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中并不意味着编译器不使用它.
有两点可以解释为什么swap()不在C中
1.函数调用语义:
包括一个swap()函数将破坏C语言中的一个非常基本的设计决策:swap()只能使用传递引用语义(C ++已添加到语言中,但在C语言中不存在),而不能使用传递语义-值。
2.可用汇编程序指令的多样性
除此之外,在任何给定的CPU体系结构上通常都有大量的汇编程序指令,而从纯C语言完全无法访问这些指令。这包括各种指令,例如中断处理指令,虚拟内存空间操作指令, / O指令,摆弄指令(在PPC指令上搜索rlwimi,以获取更强大的示例)等。
根本不可能在通用语言(例如C)中包含大量此类代码。
其中一些对于实现操作系统至关重要,这就是为什么任何OS至少都必须包含少量汇编代码的原因。它们通常使用内联汇编器封装在某些函数中,或在内核头文件中定义为预处理器指令。其他指令不太重要,或者仅对优化有用,这些指令可能是通过优化编译器生成的,许多编译器的确会生成它们(向量函数的整个类都属于此类)。
面对如此众多的多样性,C的设计师只需要将其削减到某个地方即可。他们选择提供任何可表示为简单运算符的东西,例如(+,-,〜,&,|,!,&&,||等),但没有提供任何需要函数调用语法的内容,例如swap()您建议的函数。