“功能X需要运行时支持”是什么意思?

时间:2017-07-01 00:25:58

标签: c++

引用Bjarne Stroustrup的 C ++编程语言(第4版,第15页):

  

除了newdeletetypeiddynamic_castthrow运算符以及try - 块,个别C ++表达式和语句不需要运行时支持。这对于嵌入式和高性能应用来说非常重要。

auto x = new int;在什么意义上需要运行时支持,而auto x = 2 + 2;则不然?天真地,我认为编译器只是将示例转换为某些目标代码。是什么使得创建int对象的目标代码在概念上与执行某些位算术的目标代码不同,前者被称为“需要运行时支持”?

在同一页面上,给出了一些运行时支持的例子(IIUC):

  

但是,在提供更多运行时支持的环境中使用C ++有充分的理由。动态加载,增量编译和类型定义数据库等设施可以在不影响语言的情况下得到充分利用。

没有这些设施,哪些语言功能无效?

1 个答案:

答案 0 :(得分:4)

new int动态分配内存。这意味着必须有一个从分配内存的地方。这需要运行时支持。

哦,是的,auto x = 2 + 2;也分配内存。但这是一个自动变量,而不是用户明确删除它的生命周期。自动(和静态)变量的存储可能受实现限制,但其中一些需要存在。

相比之下,您可以编写一个没有“免费存储”的C ++实现,无法从中分配内存。

还应该注意的是,Stroustrup主要讨论的是::operator new::operator delete。放置new不需要运行时支持。

从更广泛的意义上来说,当Stroustrup说“运行时支持”是有效需要在运行时调用函数的东西时。它不一定实际上是在调用一个函数,但它正在做一些非常类似于调用函数的东西。

例如,static_cast来自基类的派生类只需要一个指针偏移量。偏移值在编译时静态定义。在运行时,所有发生的事情是您将寄存器添加到常量值。

dynamic_cast需要读取大量运行时数据并遍历编译器生成的数据结构。这实际上是一个函数调用,即使它看起来不像一个(虽然它有点)。它当然具有一个性能特征。

抛出/捕获异常是一个复杂的过程,必须与许多元素进行交互,其中一些元素可能是底层操作环境的一部分。