我做了一个研究,在我看来,对于嵌入式系统的异常处理和内存分配,C缺少工具支持:
Why is the linux kernel not implemented in C++?
除了接受的答案另见Ben Collins’ answer.
“[…] anybody who designs his kernel modules for C++ is […]
(b) a C++ bigot that can’t see what he is writing is really just C anyway”” – the whole C++ exception handling thing is fundamentally broken. It’s especially broken for kernels.
– any compiler or language that likes to hide things like memory allocations behind your back just isn’t a good choice for a kernel.”
JOINT STRIKE FIGHTER AIR VEHICLE C++ CODING STANDARDS:
“AV Rule 208 C++ exceptions shall not be used”
>异常处理和内存分配是C显然缺少工具支持的唯一点(在这种情况下)?
>要解决异常处理问题,必须提供绑定的时间,直到异常被抛出后被捕获.
你能解释一下为什么内存分配是一个问题吗?如何克服这个问题呢,要做什么呢?
正如我看到的那样,在这两种情况下,必须在编译时提供一个发生的事情,并且依赖于运行时的东西.
回答:
>不,动态演员也是一个问题,但it has been solved.
>基本上yes.处理异常所需的时间必须通过分析所有投掷路径来限制.
>在Embedded systems programming中看到幻灯片上的解决方案“如何生活没有新的”.简而言之:预分配(全局对象,堆栈,池).
解决方法
然后,当您构建操作系统时,您需要知道并控制内核使用的内存的每个方面.在C中,有很多隐藏的结构,你无法控制(vtables,RTTI,异常)会严重干扰你的工作.
换句话说,Linus所说的是,通过C,您可以轻松了解正在生成的程序集,并且它可以直接在机器上运行.虽然C可以,但是您总是必须设置相当多的上下文,并且还要做一些C来接口程序集和C.另外一个原因是在系统编程中,你需要准确地知道方法的调用方式. C有很好的记录C调用约定,但在C你有这个处理,名称变化等
简而言之,这是因为C没有你问你的事情.
Per @ Josh的评论在下面,C背后的另一件事是构造函数和析构函数.它们增加了进入和退出堆栈帧的开销,最重要的是使汇编互操作更加困难,因为当您销毁C堆栈帧时,必须调用其中的每个对象的析构函数.这很快就会丑陋