【问题标题】:Is there any overhead using this-> for accessing a member?使用 this-> 访问成员是否有任何开销?
【发布时间】:2026-02-06 05:15:01
【问题描述】:

当访问某个类的成员时,我可以使用例如:

this->myVar = 10 

或者我可以写:

myVar = 10

我喜欢使用this->,因为它明确声明该变量是该类的成员,但与仅使用变量名本身相比,它是否会产生任何开销?

作为替代方案,我可以为变量添加一个唯一前缀,例如 _TmyVar,但我已经使用 this-> 很长时间了,所以我只是想知道。

【问题讨论】:

  • 考虑一种新的编码风格。例如,如果您将成员变量命名为 myVar_(带有尾随下划线),则无需使用 this->myVar_ 来表示 myVar_ 是成员这一事实。

标签: c++ performance this


【解决方案1】:

没有开销。编译器将为两个版本生成完全相同的代码。

【讨论】:

    【解决方案2】:

    这两行代码含义相同。 this-> 隐含在第二行中。他们做的事情完全相同。

    因此,它们的表现也完全相同:-)

    【讨论】:

      【解决方案3】:

      含义没有区别(除非myVar 可见多个名称,在这种情况下,普通版本可能表示函数局部变量,而this->myVar 表示成员)。所以是的,这只是风格问题。

      【讨论】:

        【解决方案4】:

        我喜欢用这个-> 因为它 显式声明变量 是这个类的成员,但它做到了 发生任何开销相比 只是使用变量名 自己?

        是的,写得更多,读得更多,并向代码的读者表明它是由不熟悉 C++ 的人编写的,因此他们不得不花费额外的时间仔细检查所有内容。所有这些都是程序员的开销。这要花钱。

        但是,没有那种通常不会花费任何成本的开销,即生成机器代码的效率。

        总而言之,有昂贵的开销,而没有便宜/免费的开销。

        作为替代方案,我可以添加一个 变量的唯一前缀,例如 _TmyVar,但我一直在使用这个-> 很长一段时间,所以我只是想知道。

        _TmyVar 形式的名称,以下划线开头,后跟大写字母,保留用于实现。

        不要那样做。

        非静态数据成员的两种最常见的 C++ 命名约定是myVar(前缀my)和var_(后缀_)。

        干杯,

        【讨论】:

        • 使用 this-> 代替前缀的一个优点是您的 IDE 可能会为您提供更好的类成员排序列表。实际上我确实喜欢 this-> 前缀。没有办法更好地表明它是类成员。但我不会为函数调用这样做。
        • @frast 不要让代码适应烂工具,程序员更重要。请参阅 Charles Petzold 的文章 "Does Visual Studio Rot the Mind?"。注意:Charles Petzold = Microsoft 的“Programming Windows”的作者, 经典的 Windows 编程书籍。干杯&hth.,
        • 好文章。我喜欢现代 IDE 的附加服务。他们让我更快。有这么多的 API,我不想记住所有的标识符。省略所有这些前缀和后缀的东西在眼睛上也更容易。好的标识符总是更好恕我直言。
        【解决方案5】:

        我有时在设置器中使用显式 this->,因为它们允许我为参数名称使用与实例字段相同的名称:

        class MyClass 
        {
            int foo;
            void setFoo(int foo) 
            {
                this->foo = foo;
            }
        }
        

        然而,在构造函数中,我通常使用初始化列表,它不需要显式的 this->

        class MyClass 
        {
            int foo;
            MyClass(int foo) : 
                foo(foo) 
            { 
            }
        }
        

        【讨论】:

        • 问题是关于使用this-> 的开销。解决名称阴影与此无关。