通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

为什么主流GC语言不支持GC和手动管理内存混合使用的方式呢

其实主流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.语法限制不太严格,程序设计自由度大。

相关文章