编译器和操作系统如何处理C++中的const变量和const指针

Leo*_*man 1 c++ pointers const

我理解这些使用"const"的技巧的抽象功能是为了安全问题,不要让程序员无意中改变事物,或者不要故意搞乱事情,或者在同一个项目的不同程序员之间意外混淆(如果我错了,请纠正我).

不清楚的是:

  1. 如何通过编译器,操作系统(进程,线程),相关的硬件(CPU,RAM)等来实现这一承诺(不变) - 即"整个系统如何'标记'这个单元在这样的处理中"一种特殊的方式".
  2. 对于非常有效的应用程序,在(C/C++)代码中使用"const"是否会降低性能,并且它是否依赖于编译器(如果是 - 请说明它的作用)?

Som*_*ken 7

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

const_cast荷兰国际集团这样const走(骗来的编译器),而数据存储在只读段,并试图覆盖它会导致不确定的行为这就是为什么编译器可以依靠程序员不这样做,因此可以提高速度.

编译器是唯一负责优化此部件的编译器,而不是任何" 操作系统(进程,线程),硬件(CPU,RAM) ".


Use*_*ess 5

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

嗯,constness 不是一个技巧,也不是通常使用该短语的意义上的安全问题

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

是的,const告诉编译器 - 以及其他开发人员,包括未来的你 - 你不打算改变某些东西

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

不,因为您可以简单地使用const_cast来绕过它(其中底层对象确实是可变的)。你不能无意中这样做。

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

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

根据您的操作系统和硬件平台,还有其他保护措施,可以防止写入您的进程不应更改的内存区域:例如,请参阅 UNIX 世界的 SEGV,它通常由内存地址映射硬件和操作系统强制执行一起工作。

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

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

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