百科问答小站 logo
百科问答小站 font logo



C++底层是如何实现的? 第1页

  

user avatar   xi-yang-86-73 网友的相关建议: 
      

首先,指针在机器层面是非常简单的东西。你不带指针的操作可能是这样:

       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没有实质上的区别:

  • 类型(在运行时)并不存在,只是编译器、语言标准给你的幻境。
  • 类基本上就是结构体;
  • 对象方法只不过是把对象实例作为隐藏参数的函数;
  • 虚函数只不过是虚表、函数指针;
  • operator只不过是名字有点特别的函数;
  • 模板实质上是代码生成的过程。

那么这里就没有什么神奇的地方了。

对于编译过程,首先C++的编译速度是臭名昭著的慢,快的只是编译出来的程序运行快。至于为什么编译出来的东西快,原因是多方面的:

  • C++本来就是用于开发性能敏感项目的,人家在写程序的时候就会注意性能问题。
  • C++通常用于编译到native code,直接由CPU执行,那么相比隔了一层解析器的语言通常会更快。
  • C++这种编译与运行时分离的语言,可以在编译时使用更耗时间的优化技术,相比运行时才编译的脚本语言会快。

至于编译器怎样优化,你学了编译原理就知道了(我并没有学过)。大致上来讲,现在的代码是给人看的,会有很多对于机器逻辑是冗余的部分,编译器会把这些冗余逻辑“收”起来。你可以看看GCC文档的优化选项部分(

),从中了解一个完备的现代编译器有哪些优化内容。


user avatar   Ivony 网友的相关建议: 
      

我不知道你说的为什么效率会那么高指的是什么效率。


其实这事儿既不深奥也不好玩,甚至有点儿二。你要真的把汇编先给学明白了,建议从C语言入手,C语言没那么多黑魔法和乱七八糟的东西,甚至有很深的汇编的影子。多看看C语言和编译后的汇编代码比对着看就明白了,就那么些套路……


我相信很多C语言大神都是可以目视编译的,就是直接看C语言代码就能大概知道编译后的汇编是什么……




  

相关话题

  现在(2021年)OSGi的发展前景如何? 
  石头和塑料袋对于计算机传感器的差别在于什么?为什么无人驾驶系统会依然存在对周围环境的误判? 
  如何评价《c++并发编程实战》这本书? 
  相较于有限状态自动机,有什么东西是只有无限状态自动机才能做的? 
  Linux 和 Windows 的内存申请机制有何不同? 
  明明很多编程语言从对象数组中取数据比用SQL从表中取数据方便,为什么数据库还是使用SQL? 
  大二学生,计算机科学与技术专业,学到数据结构和组原有点心态爆炸了,看不懂敲不出代码,还有救吗 ? 
  你遇到过哪些高质量的 C++ 面试? 
  请问有什么好的C语言面向对象的扩展的方式?最好是有比较好的项目的源码参考。 
  对于C#与C++之间的数据传输,用GCHandle或Marshal是否就是最好的方案了? 

前一个讨论
如何看待现在的快宝、花花这类机器人?
下一个讨论
如何看待中国矿业大学杨小军研究员宣称自己解决黎曼猜想?





© 2025-04-03 - tinynew.org. All Rights Reserved.
© 2025-04-03 - tinynew.org. 保留所有权利