【问题标题】:How const variable and const pointer in C++ are treated by compiler and operating system编译器和操作系统如何处理 C++ 中的 const 变量和 const 指针
【发布时间】:2016-11-14 15:46:00
【问题描述】:

我理解这些带有“const”的技巧的抽象功能是为了安全问题,不要让程序员无意中改变事情,或者不要故意弄乱事情,或者在同一项目的不同程序员之间发生意外(如果我是,请纠正我错了)。

不清楚的是:

  1. 如何通过编译器、操作系统(进程、线程)、硬件(CPU、RAM)相关等方式实现此承诺(保持不变) - 即“整个系统如何‘标记’这个单元格以以这种特殊的方式对待”。
  2. 在 (C/C++) 代码中使用“const”是否会降低性能,对于极其高效的应用程序,它是否依赖于编译器(如果是 - 请说明它依赖于哪个编译器)?

【问题讨论】:

  • “在 (C/C++) 代码中使用“const”会降低性能吗”,不;如果有的话,它将有助于提高性能。
  • const 与操作系统无关,除非它在操作系统源代码中。 const 只能被编译器看到。

标签: c++ pointers constants


【解决方案1】:

同时回答您的两个问题: const 永远不会降低性能,如果有的话,它会提高性能。这是因为在声明变量const 时允许编译器做出某些假设。它们无法更改,因此编译器可以使用它来优化您的代码,方法是重构部分 const 或将这些 const 的值添加到只读数据段,从而加快查找速度。

const_casting this const 离开(对编译器撒谎)而数据存储在只读段中并试图覆盖它会导致未定义的行为,这就是为什么编译器可以依赖程序员而不是这样做可以提高速度。

编译器是唯一负责优化这部分的人,而不是任何“操作系统(进程、线程)、硬件(CPU、RAM)”。

【讨论】:

【解决方案2】:

我理解这些带有“const”的技巧的抽象功能是为了安全问题

嗯,constness 不是骗局,也不是​​通常使用短语的意义上的安全问题

...不要让程序员无意中改变事物...

是的,const 告诉编译器——以及包括你未来的自己在内的其他开发者——你不打算改变某些东西

...或者不要故意弄乱事情...

不,因为您可以简单地使用const_cast 来绕过它(底层对象是真正可变的)。你不能意外地做到这一点。

...这个承诺(保持不变)是如何通过编译器实现的...

就是这样。这就是一切。编译器拒绝编译使const 对象发生变异的代码。如果改变 const 对象的代码无法编译,则在运行时无需执行任何操作,也无需执行任何操作。

还有其他保护措施,具体取决于您的操作系统和硬件平台,防止写入您的进程不应更改的内存区域:例如,参见 UNIX 世界的 SEGV,它通常是由您的内存地址映射硬件和操作系统共同执行。

这些运行时概念并不直接用语言表达,尽管它们确实会影响语言在给定平台上的实现方式。

...在(C/C++)代码中使用“const”会降低性能吗...

不,const 通常用于更清楚地表达您的代码的预期行为方式,并且这些额外信息有时允许编译器进行更多优化。我想不出一个明显的原因为什么它会使任何事情变慢,除非它强制执行原本可以避免的副本。

【讨论】:

    【解决方案3】:

    您错误地认为这是出于安全原因:事实上,const 关键字不是由编译器强制执行的。即使是编译器也可以通过const-cast 命令忽略const 关键字。

    因此,const 在运行时没有与性能相关的考虑因素(可能在编译时存在,因为编译器可能会使用它来以不同方式优化代码)。

    【讨论】:

    • 所以我知道操作系统不知道某些变量对象在代码中是 const 还是不是。这意味着在运行时,如果代码流试图改变 const 变量或对象——这种情况是不可能的,编译器会错误地阻止它。
    • 编译器将阻止修改const 对象(产生错误) - 但正如我所说,即使这可以通过简单的转换来克服。在运行时,系统和操作系统根本不知道 const 内存,因此它不是安全功能(恶意代码可以轻易修改它)
    【解决方案4】:

    Herb Sutter 的 article 回答了您的大部分问题。

    当变量为const 时,编译器假定该变量在此范围内没有更改,并使用该信息来优化代码。

    任何修改它的尝试都会导致未定义的行为:

    除了可以修改任何声明为 mutable (7.1.1) 的类成员, 任何在 const 对象的生命周期 (3.8) 中修改其结果的尝试 在未定义的行为中。

    【讨论】:

    【解决方案5】:

    如何通过以下方式实现这一承诺(保持不变) 编译器、操作系统(进程、线程)、硬件(CPU、RAM) 相关等 - 即“整个系统如何'标记'这个单元格以进行治疗 这种特殊的方式”。

    const 强制执行只读合约,并且违反该合约将始终在编译时被发现 - 对于正确(符合标准的代码)代码;除了const_cast

    编译器通常非常了解其目标架构。并且正确使用const 可以帮助它构建以特殊方式生成的代码以提高安全性也许是速度。注意:const 永远不会降低速度,除非你的编译器坏了。

    const 对象可以保存在只读内存中,也可以保存在可以标记为只读的特殊内存中(这强制一种形式的硬件安全,在将内存标记为只读后尝试写入将触发访问冲突异常。

    在 (C/C++) 代码中使用“const”会降低性能吗? 非常高效的应用程序,它是否依赖于编译器(如果 是的 - 请具体说明它是做什么的)?

    不,它没有。如果是这样,则该编译器有问题。

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多