• C/C++的指针到底是不是鸡肋?
  • 发布于 2个月前
  • 264 热度
    0 评论
通过指针,程序员可以用c++或c语言直接操作内存,包括申请内存空间,往里面塞值,用好以后释放掉,但是要看使用场景。比如你用c++或c开发单片机嵌入式的代码,这些设备的内存本来就不多的,或者是开发游戏,对内存性能有一定的要求,那么用指针管理内存也行。

但是如果是做业务系统,那么c或c++语言能直接访问内存的特性,不仅属于鸡肋,而且甚至还会提升项目开发的难度。原因是,程序员在能自行管理内存的同时,还得自行确保内存效率,具体来说要解决内存泄漏问题。

本人用c++做过至少2个项目,一个是用OpenGL绘图,另一个是管理车载系统,开发时确实可以直接开辟内存往里写,但问题是,比如我在某方法里申请一块内存,这个方法被层层调用了5,6层,那么这时如果不释放内存的话,会报内存泄漏,如果释放,而且还得找到最后调用的方法,在其中释放,释放早了,其它方法用的时候找不到该块内存,代码直接崩溃。

而且这种事情不是做一次,每次发布前,都得用专门的工具扫描一次,找出泄漏点并修掉,但代码开发越到后面各种调用关系越复杂,而且每次在写free或delete等删除内存块的代码时,还要担心是否早删了,一旦早删就崩。

量化一下吧,每次发布前,至少得用2天时间调整内存,所以责任就是负担,在一些内存较小的设备上开发,不得不承受这个负担,但相应地也能得到好处。但如果是开发业务系统,内存管够,真就可以用java等来开发,让Java虚拟机来管理内存。

如果说起内存管理的实时性,那应该没直接操作内存效率高,比如是在10点20分用好一块内存,用c++的话,可能当时就释放了,用java虚拟机的话,可能是10点30释放,但程序员就很省心了,不用主动关内存,所以也不会导致系统崩溃。

这里还有一个问题,在业务系统里,比如电商或管理系统,提升性能其实不是靠单机版,而是靠集群和组件,比如某业务系统部署多台服务器,或者再引入Redis缓存或异步消息等组件。而是靠自己写内存代码提升内存性能,所以当下做业务系统一般都用Java,或者是c#,让虚拟机来管内存,而不是直接用c++。

写了那么多,做个总结吧。

1 学c或c++的时候,指针以及用指针管理内存的技能,可以学,而且是重点。但换句话说,如果不项目开发不用c++,指针方面的技能你听了就算了,可能没地方用。

2 C或C++有自己的应用场景,相比java或python,c和C++的应用场景是多还是少,这里不讨论,但在偏重业务的场景里,c++本身用得不多,也就是说,用C++管内存的场景也不多。

3 不同业务场景里提升性能的做法是不同的,比如用的是c或c++,那么确实可以通过改写指针的代码来提升内存使用效率,但如果是用java开发的web应用,那么是把内存的管理权交给虚拟机,而且是从集群等角度来调优性能。
用户评论