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

which system software is responsible for Run time check

我认为这听起来是一个普遍的简单问题,但我在阅读 C++ 异常规范时提出了这个问题。在其中一本书中说,C++11 现在有一个关键字 'noexcept' ,这意味着当函数用函数头声明时不会抛出异常,并且说这个关键字存在的原因是 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 进行优化(希望如此)

void foo() noexcept();

这是主要问题。哪个系统软件执行那些 运行 时间检查(我希望不是 compiler/linker/loader)以及哪个系统软件负责在 运行 时间分配内存(动态内存分配),而这些都没有被采用编译器和其他人关心?

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

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

没有主动 "system software" 检查异常情况,如您所说;相反,抛出异常是程序本身采取的行动。程序将异常传递回堆栈,直到异常与异常处理程序匹配。

如果没有异常处理程序匹配,则异常被 bootstrap 代码捕获(main 不是典型程序的实际入口点,而是运行时将控制权交给程序员的地方)和程序终止。

通常情况下,负责的软件不是一段清晰可辨的代码,而是散布在可执行文件中的一小段代码。编译器将你的代码翻译成二进制指令,noexcept也不例外;).

确实,您不会说 "standard library" 处理这个问题。异常和异常规范是一个核心语言特性,比标准库更基础。

您可能会类似地问,当我在 C++ 中调用函数时,哪个软件可以确保调用者实际接收到我传入的值?当我的程序 运行?

时,哪个软件操纵堆栈帧指针

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

当你问

also which system software is responsible for allocating memory at run time(dynamic memory allocation

这又是一个实现细节,它会因编译器而异。