【问题标题】:const pointer vs pointer: C++常量指针与指针:C++
【发布时间】:2021-10-02 04:46:57
【问题描述】:

我是 C++ 新手,正在尝试弄清楚我应该做什么。

以下选项在性能上是否存在差异:

const DATATYPE* name

DATATYPE* name

【问题讨论】:

  • 可能有,编译器可能有更多选项来优化const 变量。但这是const 最不重要的功能(无论如何您不太可能注意到性能上的任何差异)。
  • 除非您需要修改对象,否则请始终使用const。如果可以的话,请尽量避免使用指针。
  • 还有一些吹毛求疵:不是 pointer 是恒定的,而是指向 to 的对象/数据。这种区别非常重要,因为您实际上可以拥有一个常量指针(即DATATYPE* const
  • 您可以尝试在少数情况下测试差异,并使用godbolt.orgobjdump 检查生成的程序集,以查看编译器是否对其中一个进行了任何优化。不过一般来说,不要关心优化,只要你不必修改取消引用的值,就使用const T *,否则不要使用const
  • 你很少需要像那样直接使用指针。这对 codegen 的直接影响为 0(可能有一个 const_cast 来删除 const,可以通过不同的指针修改对象等)。如果调用 name->method() 最终会因为 const 而调用不同的函数,这可能很重要。

标签: c++ pointers constants c++17


【解决方案1】:

在这种情况下,实际上不应该有任何性能提升,因为您示例中的关键字 const 仅告诉编译器指针访问将被限制为只读访问(这只会提高性能,例如在互斥锁的情况下-protected 或 atomic 指针)。但是指针本身将是一个变量!

但是,如果您打算使用指向只读值的常量指针,那么您将不得不像这样声明它:

const DATATYPE *const name

即使在这种修改后的情况下,大多数编译器也不应该看到任何性能改进,因为好的编译器会自动检测某些内容是否在给定代码中实际上被视为常量和/或只读实体,然后进行相应的优化(内部) 程序员不必在任何地方都为多余和过度的“常量装饰”而烦恼。 (并不是说所有 const 的使用都是多余的——远非如此,例如,明确用于定义只读实体的 const 是一个良好且安全的 API。)

【讨论】:

  • 在 C++ 中const 不仅仅是为了可读性更重要。例如,只有 const 引用可以绑定到临时对象。
  • @MSalters,当然,但我从来没有说过 const 是“只是为了可读性”。实际上,请阅读我帖子的最后一句话,我明确地说“不是说所有 const 使用都是多余的——远非如此”。 const 有许多有用的角色。但是,正如官方 C++ 指南中所指出的那样,许多用途只是迂腐和多余的(是的,它们自己确实使用了“迂腐”这个词)。另外,请注意,这家伙问的是性能提升,所以我们在这里有点跑题了。
猜你喜欢
  • 2014-02-23
  • 2020-03-25
  • 1970-01-01
  • 2012-04-22
  • 2014-06-26
  • 2011-08-04
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多