【问题标题】:What responsibilities are to comply C\C++ standard?遵守 C\C++ 标准的责任是什么?
【发布时间】:2015-07-27 06:20:45
【问题描述】:

有点愚蠢的问题。 例如,我读过,在 C11 中添加了对线程的支持。 然后,例如我的 STM32F4 的 GCC 编译器说,它支持 C11 标准。 那么,这是否意味着,如果没有操作系统,我将获得线程支持???但怎么可能呢?

另一个例子 - STM32 的 g++ 支持 std::vectors,并且它可以工作,即使没有操作系统的内存管理。 这意味着一些内存管理器在编译器内部?或不?

【问题讨论】:

  • 必须始终有某种底层支持。即使没有操作系统,库中也可能有底层特定于平台的代码来处理内存或简单的多任务处理等事情。如果不知道您的编译器版本(我们不知道)以及您链接的软件或其他支持库,就不可能说什么。
  • 您很可能正在查看所谓的“独立”编译器工具链。 C++11 具有核心语言特性(期望它们存在)和库特性(期望它们参差不齐/不存在)。此外,“内存管理”始终是一项 libc 任务。操作系统必须有一些基本的进程模型(即使它只是“内存是你的”)
  • C11 线程支持是可选的,实现可能会定义__STDC_NO_THREADS__ 以指示不支持threads.h
  • C11 7.26.1/2 "定义宏 __STDC_NO_THREADS__ 的实现不需要提供这个头文件,也不需要支持它的任何功能。"

标签: c++ c gcc stm32 c11


【解决方案1】:

C 实现有两种——hosted 实现,提供标准库,freestanding 实现,只需要提供核心语言和最少数量的标题。嵌入式系统的实现通常是独立的。这在the C11 spec 的第 4 节中有详细描述。

此外,即使在托管实现中,也有许多功能可以省略。特别是,线程支持是可选的(省略线程支持的托管实现必须定义宏__STDC_NO_THREADS__)。这在规范的第 6.10.8.3 节中有所描述。

【讨论】:

    【解决方案2】:

    那么,这是否意味着,如果没有操作系统,我将获得线程支持???

    这意味着指定语言以便可以正确编写多线程程序,并在访问共享数据时具有良好定义的同步;并且一个完整的托管实现应该提供线程库。这并不意味着所有实现都允许多线程:这将取决于底层系统的支持。

    这意味着编译器内部有一些内存管理器?

    是的,通常语言运行时包括一个堆管理器。它将被分配一些内存(从操作系统获得,或者以其他一些与系统相关的方式分配,可能只是在程序启动时作为静态块),然后将其拆分成更小的块以支持程序内的动态分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2010-11-19
      • 2016-01-29
      相关资源
      最近更新 更多