其实主流GC语言支持GC和手动管理内存混合使用的方式。任何语言都可以直接调用系统函数申请一块虚拟内存,或者去调用c/c++包装的malloc free函数的dll。一般都提供了,只不过你没找到,比如c# java都有。
一、主流GC语言支持GC和手动管理内存混合使用的方式
任何语言都可以直接调用系统函数申请一块虚拟内存,或者去调用c/c++包装的malloc free函数的dll。“如果没有,为何主流gc语言都不提供呢?”,一般都提供了,只不过你没找到,比如c# java都有。c# Marshal.AllocHGlobal Marshal.FreeHGlobal
java sun.misc.UnSAFe allocateMemory freeMemory
除此之外,还可以直接调用系统dll,c#和go调用dll非常容易,java可能要包装jni。或者任意语言都可以用libffi这种低性能的东西去调用dll so。
比如直接调用 windows Kernel32.dll->virtualAlloc VirtualFree linux sys_mmap munmap,你完全可以做到自己掌控内存,但你真的懂吗?
无论你java c# go,都可以去调用,但你能知道怎么在实际业务中用吗?你非常多当一块数组用,仅此而已,那得用c的思维去编程,没有c工程经验的来说这个功能根本玩不转。
某种角度来说C++通过对象生命周期和析构函数的组合,做到了栈上空间即用即放,堆上空间不删不放。
在C#中可以通过把对象设置为null的方式结束内存生命周期然后调用System.GC.Collect()来强制回收内存。
如果对内存不敏感,那就放心用GC,GC压力大那是GC的事儿,自己省心不就好了,如果对内存敏感,那你就用C/C++自己控制,相对整个项目而言,良好的设计比几个强制内存回收更能决定性的提升性能。
设计语言是为了解决问题,而不是制造麻烦。根据自己需要挑一把最趁手的锤子才是关键。
延伸阅读:
二、C语言的主要特点
1.语言简洁、紧凑,使用方便、灵活 。C语言一共只有32个关键字、9种控制语句,程序书写形式自由,主要用小写字母表示,压缩了一切不必要的成分。C语言比其他许多高级语言简练,源程序短,因此输入程序时工作量少。
2.运算符丰富,C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值和强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。
3.数据类型丰富。C语言提供的数据类型包括整形、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C99又扩充了复数浮点型、超长整型(long long)和布尔类型(bool)等。尤其是指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构(如链表、树、栈等)的运算。
4.具有结构化的控制语句。用函数作为程序的模块单位,便于实现程序的模块化。C语言是完全模块化和结构化的语言。
5.语法限制不太严格,程序设计自由度大。