C++ 如何克服C++';缺乏对嵌入式系统的工具支持?
问题不在于Linux内核。这不是C与C++的辩论。< /强> 我做了一项研究,在我看来,C++在嵌入式系统的异常处理和内存分配方面缺少工具支持: 除公认答案外,另请参见 : [P>…………为C++设计内核模块的任何人都是…… (b)一个不能看到他正在写什么的C++偏执狂实际上只是C“< /P>” “完全C++异常处理的东西从根本上被打破了。它对于内核特别地被破坏。”C++ 如何克服C++';缺乏对嵌入式系统的工具支持?,c++,real-time,C++,Real Time,问题不在于Linux内核。这不是C与C++的辩论。< /强> 我做了一项研究,在我看来,C++在嵌入式系统的异常处理和内存分配方面缺少工具支持: 除公认答案外,另请参见 : [P>…………为C++设计内核模块的任何人都是…… (b)一个不能看到他正在写什么的C++偏执狂实际上只是C“< /P>” “完全C++异常处理的东西从根本上被打破了。它对于内核特别地被破坏。” -任何喜欢在背后隐藏内存分配之类内容的编译器或语言都不是内核的好选择。” : “AV规则208 C++例外不应使用”< /P>
-任何喜欢在背后隐藏内存分配之类内容的编译器或语言都不是内核的好选择。”
:“AV规则208 C++例外不应使用”< /P>
回答:
嗯,有几件事。首先,您必须记住STL完全是基于操作系统例程、C标准库和动态分配构建的。在编写内核时,没有动态内存分配(您提供了它),没有C标准库(您必须提供一个构建在内核之上的库),您提供的是系统调用。然后,C C互操作非常好,很容易用汇编,而C++与汇编接口非常困难,因为ABI不一定是常数,也不一定是名称。因为名称的混乱,你会有一个全新的复杂程度 然后,您必须记住,在构建操作系统时,您需要了解并控制内核使用的内存的各个方面。在C++中,有很多隐藏的结构,你无法控制(vTABLE,RTTI,异常),这会严重干扰你的工作。 换句话说,Linus所说的是,使用C,您可以很容易地理解正在生成的程序集,并且它非常简单,可以直接在机器上运行。虽然C++可以,但是你必须总是设置一点上下文,并且仍然做一些C来处理程序集和C。另一个原因是,在系统编程中,你需要知道如何调用方法。C有非常好的C调用约定,但是C++中有<代码>这个< /C> >处理,名称修改,等等。 简而言之,这是因为C++没有你的要求就做了事情。< /P>
Josh @的评论,另一件事C++背后做的是构造函数和析构函数。它们增加了输入和退出堆栈帧的开销,最重要的是,使汇编互操作更加困难,因为当您破坏C++堆栈帧时,必须调用其中的每个对象的析构函数。这很快就会变得难看。
我真的不喜欢语言战争,我已经投票决定再次结束这场战争。但无论如何嗯,有几件事。首先,您必须记住STL完全是基于操作系统例程、C标准库和动态分配构建的。在编写内核时,没有动态内存分配(您提供了它),没有C标准库(您必须提供一个构建在内核之上的库),您提供的是系统调用。然后,C C互操作非常好,很容易用汇编,而C++与汇编接口非常困难,因为ABI不一定是常数,也不一定是名称。因为名称的混乱,你会有一个全新的复杂程度 <>不,用C++你可以声明函数有<代码>外部“C”<代码>(或者可选地<代码>外部)汇编“< /COD>”调用约定。这使得名称与同一平台上的所有其他名称兼容 然后,您必须记住,在构建操作系统时,您需要了解并控制内核使用的内存的各个方面。在C++中,有很多隐藏的结构,你无法控制(vTABLE,RTTI,异常),这会严重干扰你的工作。 在编码内核特性时必须小心,但这并不局限于C++。当然,不能使用
std::vector
作为内存分配的基础,但也不能使用malloc
进行分配。您不必使用所有C++类的虚拟函数、多重继承和动态分配,是吗?
换句话说,Linus所说的是,使用C,您可以很容易地理解正在生成的程序集,并且它非常简单,可以直接在机器上运行。虽然C++可以,但是你必须总是设置一点上下文,并且仍然做一些C来处理程序集和C。另一个原因是,在系统编程中,你需要知道如何调用方法。C有非常好的C调用约定,但是在C++中有这个处理,名字命名,等等。
Linus可能声称他可以发现对f(x)
的每一个调用,并立即看到它正在调用g(x)
,h(x)
,以及q(x)
20层。仍然MyCl
int f( int a )
{
if( a == 0 )
return -1;
if( g() < 0 )
return -2;
f3();
return h();
}