Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何克服C++';缺乏对嵌入式系统的工具支持?_C++_Real Time - Fatal编程技术网

C++ 如何克服C++';缺乏对嵌入式系统的工具支持?

C++ 如何克服C++';缺乏对嵌入式系统的工具支持?,c++,real-time,C++,Real Time,问题不在于Linux内核。这不是C与C++的辩论。< /强> 我做了一项研究,在我看来,C++在嵌入式系统的异常处理和内存分配方面缺少工具支持: 除公认答案外,另请参见 : [P>…………为C++设计内核模块的任何人都是…… (b)一个不能看到他正在写什么的C++偏执狂实际上只是C“< /P>” “完全C++异常处理的东西从根本上被打破了。它对于内核特别地被破坏。” -任何喜欢在背后隐藏内存分配之类内容的编译器或语言都不是内核的好选择。” : “AV规则208 C++例外不应使用”< /P>

问题不在于Linux内核。这不是C与C++的辩论。< /强>

我做了一项研究,在我看来,C++在嵌入式系统的异常处理和内存分配方面缺少工具支持:

除公认答案外,另请参见

:

[P>…………为C++设计内核模块的任何人都是…… (b)一个不能看到他正在写什么的C++偏执狂实际上只是C“< /P>” “完全C++异常处理的东西从根本上被打破了。它对于内核特别地被破坏。”
-任何喜欢在背后隐藏内存分配之类内容的编译器或语言都不是内核的好选择。”


“AV规则208 C++例外不应使用”< /P>


>P>是异常处理和内存分配的唯一点,C++显然缺少工具支持(在此上下文中)?

  • 要解决异常处理问题,必须提供时间绑定,直到抛出异常后捕获异常为止

  • 你能解释一下为什么内存分配是个问题吗?如何克服这个问题,必须做些什么

  • 正如我所看到的,在这两种情况下,都必须在编译时提供一个上界,该上界取决于运行时发生的一些非平凡的事情


    回答:

  • 不,动态强制转换也是一个问题,但是

  • 基本上。处理异常所需的时间必须通过分析所有抛出路径来限定

  • 请参阅中幻灯片“如何在没有新功能的情况下生活”中的解决方案。简而言之:预分配(全局对象、堆栈、池)


  • 嗯,有几件事。首先,您必须记住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();
    }