首先,指针在机器层面是非常简单的东西。你不带指针的操作可能是这样:
int add(int a, int b) { return a+b; }
编译成伪汇编:
从栈顶寄存器+偏移a的位置,取四个字节到通用寄存器1 从栈顶寄存器+偏移b的位置,取四个字节到通用寄存器2 在通用寄存器1和通用寄存器2执行四字节整数加法,结果在通用寄存器2 将通用寄存器2存储四个字节,到栈顶+RESULT的位置
带指针:
int add(int* a, int* b) { return *a+*b; }
编译成伪汇编:
从栈顶寄存器+偏移a的位置,取八个字节到通用寄存器1 按照通用寄存器1的内容作为位置,取四个字节到通用寄存器1 从栈顶寄存器+偏移b的位置,取八个字节到通用寄存器2 按照通用寄存器2的内容作为位置,取四个字节到通用寄存器2 在通用寄存器1和通用寄存器2执行四字节整数加法,结果在通用寄存器2 将通用寄存器2存储四个字节,到栈顶+RESULT的位置
引用很大程度上只是语法糖,实际编译出来的实现可能是:
什么都不做,只是编译限制。比如同作用域里的别名:
int a = 1; int& b = a;
就是个地址,比如作为成员、作为函数参数:
struct van { int& fuckyou; } void deep_dark_fantasy(int& ass_we_can);
对于C++,忽略RTTI和try catch的事情,C++和C没有实质上的区别:
那么这里就没有什么神奇的地方了。
对于编译过程,首先C++的编译速度是臭名昭著的慢,快的只是编译出来的程序运行快。至于为什么编译出来的东西快,原因是多方面的:
至于编译器怎样优化,你学了编译原理就知道了(我并没有学过)。大致上来讲,现在的代码是给人看的,会有很多对于机器逻辑是冗余的部分,编译器会把这些冗余逻辑“收”起来。你可以看看GCC文档的优化选项部分(
),从中了解一个完备的现代编译器有哪些优化内容。
我不知道你说的为什么效率会那么高指的是什么效率。
其实这事儿既不深奥也不好玩,甚至有点儿二。你要真的把汇编先给学明白了,建议从C语言入手,C语言没那么多黑魔法和乱七八糟的东西,甚至有很深的汇编的影子。多看看C语言和编译后的汇编代码比对着看就明白了,就那么些套路……
我相信很多C语言大神都是可以目视编译的,就是直接看C语言代码就能大概知道编译后的汇编是什么……