【问题标题】:Does using "this" keyword in c++ have any impact on performance? [duplicate]在 C++ 中使用“this”关键字对性能有影响吗? [复制]
【发布时间】:2015-12-12 17:44:05
【问题描述】:

很长一段时间以来,我一直在使用 JavaScript,其中 this 关键字是必需的。现在,我正在用 C++ 编程,但使用 this 关键字的习惯仍然存在。但真正的问题是 - 使用 this 关键字是否会对性能产生负面影响(如不必要的内存访问)?我的意思是 - 代码省略 this 对编译器更友好还是完全无关紧要?因为从理论上讲,引用this 有点像引用指针,就像汇编程序中的opcode $reg0, [$reg1],它可以在代码中添加一个更多的内存引用,但我想编译器应该以比典型指针更聪明的方式处理它,对吗?

我个人更喜欢使用this,因为我觉得在不使用它的代码中有点迷失,因为我不知道某些变量是否是成员,或者它们是本地的还是全局的或什么,但如果它会导致性能问题我可能会强迫自己避免它。

【问题讨论】:

  • 没有区别。写你喜欢的任何东西。
  • 您可以使用gcc.godbolt.org添加和删除this->,看看生成的程序集是否有变化。 (即使没有优化也不会。)
  • @zenith:我认为关于优化的问题完全被混淆了。添加this-> 是纯语法级别的细节。表达式的含义是完全一样的,当然你需要解释一个相对于某个对象实例的成员名。

标签: c++ performance assembly heap-memory


【解决方案1】:

不,optimizing compiler(对于 C++11 或更高版本)很可能会为this->field 和field 生成相同 二进制代码,同样为this->memberfun(2,3) 和memberfun(2,3).

(可能,即使没有优化,也会产生同样的-低效-代码;但我不确定)

有时(特别是在编码模板时)this 是必需的,因为省略它有不同的含义(我忘记了哪些奇怪的情况)。

当然,编译时间可能会略有不同。但你不应该在意。

出于可读性原因,某些编码约定要求或(更经常)禁止使用this。选择您喜欢的任何约定,但要保持一致。

另请参阅 this answer 解释如何在 Linux x86-64 ABI 上实际处理 this。

【讨论】:

  • 未优化的编译器会做什么?
  • @KerrekSB:我们不在乎。如果这样做,请检查生成的汇编代码(例如,使用 g++ -std=c++11 -fverbose-asm -O0 -S 编译)
  • 我的意思是这种说法没有意义。实例引用在任一拼写中都隐含,并且需要相同的代码。优化与它无关。
  • 我不确定。也许有些编译器将显式 this 放在调用堆栈上(但将 implicit this 保留在某个寄存器中)。
【解决方案2】:

但真正的问题是 - 使用此关键字是否会对性能产生负面影响(如不必要的内存访问)?

没有。

这可能会在代码中增加一个内存引用,但我想它应该由编译器以比典型指针更聪明的方式处理,对吗?

是的

:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 2018-04-03
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2011-11-12
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多