因为C/C++允许程序员做出更多选择。
选择更多,那么:
弊端:开发效率难以提高,因为有太多选择需要斟酌。
优势:执行效率可以逼近极限,因为不会有什么抽象拦住你。
举个例子吧:大家可能对Java无处不在的“对象.方法调用().方法调用().方法调用()”记忆犹新,论坛上也到处都是吐槽这个的。
当然,这个是显学,这里并不想讨论它。
不过,还有个东西藏在表面的繁复实现后面,可能很多人并不知道:函数调用非常浪费时间,这里面有大把的优化空间。
其中,函数使用的局部变量就是个很大的问题。
对于c/c++,以及其它任何“传统”编译型语言,都可以在函数内定义一个“局部变量”,这个局部变量默认分配在栈上——而栈是由CPU提供的专门指令硬件维护的。
因此,栈上数据的分配/删除速度极快(一条指令即可完成);而且栈空间是连续的,所以哪怕在不同函数间来回跳转,也不会出现缓存未命中问题;最后,因为“函数抽象”非常完善,所以这里的内存分配/回收完全无需用户干预。
当然了,这也带来了一些问题。比如程序员不得不区分栈上对象和堆上对象、遇到异常时栈上对象的释放也变得复杂而微妙……但总的来说,从这里得到的好处太大,困难与之相比,并不足论。
举例来说,3D API经常需要传递point2D或者point3D进去。
对任何“传统”语言,这都不是个问题:只要把这个小对象声明到栈上,然后调用相关API,完成。
甚至,对大多数编译器来说,很容易就能识别出“这是个需要传递给其它函数的局部变量”——于是,它会自动把这个point2D/point3D放进寄存器,从而连压栈/退栈指令都不需要执行!
你看,当我需要传递一个小对象时,用c/c++,压根无需思考,声明成局部变量,编译器就把该做的事情全帮我做了——传递它,除了会占用几个通用寄存器,我甚至无需付出哪怕一条指令的代价!
哪怕最差情况,传参的代价也不过是执行了几次push/pop这两条机器指令而已。
刚好我这里有资料需要的可以私我