返回信息流我最近在学c++,但是不知道具体有什么用
这是一条镜像帖。来源:北邮人论坛 / cpp / #84198同步于 2014/11/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
学c++有什么用啊
chulianrui88
2014/11/21镜像同步47 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 chulianrui88 的大作中提到: 】
: 看不懂啊
为了让你看看C++到底大家都用来做了什么,有些工控程序就是用C++写的,还有好些开源的工程都是C++写的,可以这么说,Java SE能干的,C++基本上都能干。C++能干的,Java不一定能干。
【 在 FromSixToTen 的大作中提到: 】
:
: 为了让你看看C++到底大家都用来做了什么,有些工控程序就是用C++写的,还有好些开源的工程都是C++写的,可以这么说,Java SE能干的,C++基本上都能干。C++能干的,Java不一定能干。
忍不住列举几个Java能做但C++不能做的事:
1. 运行时随便给一个对象,知道它有哪些域,哪些方法。(Java的反射功能,详见 https://docs.oracle.com/javase/tutorial/reflect/ 。C++有RTTI,但没有这么强大)
2. 运行时创建一个类的子类。(Java的CGLib可以用反射和代码生成器在运行时生成Java Bytecode,一般用来做“代理”对象用。很好玩的程序。详见 https://github.com/cglib/cglib 。C++没有可移植的方法。但用LLVM+Clang以及它的JIT编译器可以达到类似的效果,但必须保证主程序本身也是用同一个版本的LLVM+Clang编译的,使用同一个版本的libc++,并且保留着头文件。Java的话,bytecode里,基本的类型信息都保留着。)
3. 打印stack trace,也就是栈上每个帧正在执行哪个函数的哪一行。(Java异常处理的功能,依赖虚拟机支持。C++依赖具体的编译器支持,比如GCC特有的execinfo.h,没有可移植的方法。)
4. 强迫另一个暂停的线程(或者当前线程)的正在执行的函数提前返回,跳过finally。(Java可以用JVM TI来做,详见 https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#ForceEarlyReturn 。但C++没有虚拟机,没办法了。)
5. 在一个production模式的程序的运行时突然切换成debug模式,并加几个断点。(有Java虚拟机的支持,运行时篡改可执行代码是很容易的。这个是Oracle的研究项目Truffle虚拟机的新功能,但目前实现的是ruby语言(jruby)。论文在这里: http://www.lifl.fr/dyla14/papers/dyla14-3-Debugging_at_Full_Speed.pdf )
6. 在运行时把一个执行得比较频繁的循环拿出来优化编译一下。(这就是为什么HotSpot虚拟机叫HotSpot的原因。确切地说是在Java Bytecode级别上做。C++运行时一般不带编译器。LLVM+Clang可以做到,但程序必须为这种优化准备,而且必须留着源代码(光是头文件不够),还要有机器码到源代码的对应关系,当然,最重要的是连这种运行时优化器也要再开发一个,因为Clang不是为这种优化设计的。DynamoRio可以做类似的运行时优化编译(人家是tracing JIT的鼻祖),但是是在机器码的级别上做,不是C++。)