哪个系统软件负责运行时检查

时间:2016-02-04 18:43:10

标签: c++ c++11 compilation runtime

我认为这听起来是一个普遍的简单问题但我在阅读C ++异常规范时提到了这个问题。在本书的其中一篇文章中,C ++ 11现在有一个关键字'noexcept',这意味着当函数使用函数头声明时,函数不会抛出任何异常,并且表示此关键字出现的原因是{ {1}}因此他们总结了两个案例,一个函数会抛出异常,或者如果我们清楚它是否永远不会抛出,那么使用C++ exception specifications are checked at run time rather than at compile time, so they offer no programmer guarantees that all exceptions have been handled.进行优化(希望如此)

noexcept

这是主要问题。哪个系统软件执行那些运行时检查(我希望不是编译器/链接器/加载器)以及哪个系统软件负责在运行时分配内存(动态内存分配),而编译器和其他人都没有这样做?

4 个答案:

答案 0 :(得分:3)

没有活跃的"系统软件"检查异常,就像你说的那样;相反,抛出异常是程序本身采取的行动。程序将异常传递回堆栈,直到异常与异常处理程序匹配。

如果没有异常处理程序匹配,则引导代码捕获异常(main不是典型程序的实际入口点,而是运行时控制程序员的位置),程序终止。

答案 1 :(得分:2)

AFAIK这是由C ++运行时完成的(例如libstdc ++)。在异常的情况下,编译器在函数周围添加了一些保护(无论如何在抛出异常的情况下调用析构函数是必要的),并且在noexcept的情况下,如果函数抛出(或者抛出其他异常,则抛出异常)由throw()规范公布),由C ++运行时调用terminate()并关闭应用程序。

内存堆分配(默认情况下)也由C ++运行时库完成。

答案 2 :(得分:2)

通常情况下,负责任的软件不是一个明确可识别的代码片段,而是通过可执行文件散布的小代码片段。编译器将您的代码转换为二进制指令,noexcept也不例外;)。

答案 3 :(得分:1)

确实,你不会说"标准库"处理这个。异常和异常规范是核心语言特性,比标准库更为基础。

您可以类似地问,当我在C ++中调用函数时,哪个软件确保调用者实际接收我传入的值?在我的程序运行时,什么软件操纵堆栈帧指针?

从标准的角度来看,我会说"实施"负责这些细节。在某些语言中,例如Java,有一个" Java运行时环境"对这些事情负有非常明确的责任,你可以尝试准确地研究它是如何做到的。在C ++中,没有通用的运行时环境 - 就像其他人所说的那样,编译器负责生成确保这些事情发生的代码,并且代码最终会散布在生成的可执行文件中。编译器如何完成其​​任务是特定于实现的,您无法给出超出标准所述的一般答案,并且通常它指定了预期的行为,而不是引擎盖下的细节。

当你问

  

哪个系统软件负责在运行时分配内存(动态内存分配

这又是一个实现细节,它将不同于编译器。