这个指针和性能损失

Ste*_*ing 10 c++

void do_something() {....}

struct dummy
{
   //even I dont call this, compiler will call it fall me, they need it
   void call_do_something() { this->do_something_member(); } 
   void do_something() {....}
};
Run Code Online (Sandbox Code Playgroud)

据我所知,当你想要访问数据成员或类的成员函数时,C++中的每个类或结构都会隐含地调用这个指针,这会给C++带来性能损失吗?

我的意思是

int main()
{
  do_something(); //don't need this pointer
  dummy().call_do_something(); //assume the inline is prefect

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

call_do_something需要一个this指针来调用成员函数,但是像do_something这样的C不需要这个指针,这个指针在与C like函数比较时会带来一些性能损失吗?

我没有任何意义可以做任何微优化,因为它会给我带来这么多时间,但总是不会给我带来好结果,我总是遵循"衡量,不思考"的规则.我想知道这个指针会因为好奇而带来性能损失.

Cor*_*lks 8

取决于这种情况,但通常情况下,如果你已经开启优化,它不应该比C版本贵.您真正"支付" this和其他功能的唯一时间是您使用继承和虚拟功能.除此之外,编译器足够聪明,不会this在你不使用它的函数中浪费时间.考虑以下:

#include <iostream>

void globalDoStuff()
{
    std::cout << "Hello world!\n";
}

struct Dummy
{
    void doStuff() { callGlobalDoStuff(); }
    void callGlobalDoStuff() { globalDoStuff(); }
};

int main()
{
    globalDoStuff();

    Dummy d;
    d.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

使用GCC优化级别编译O3,我得到以下反汇编(削减额外的垃圾并显示main()):

_main:
0000000100000dd0    pushq   %rbp
0000000100000dd1    movq    %rsp,%rbp
0000000100000dd4    pushq   %r14
0000000100000dd6    pushq   %rbx
0000000100000dd7    movq    0x0000025a(%rip),%rbx
0000000100000dde    leaq    0x000000d1(%rip),%r14
0000000100000de5    movq    %rbx,%rdi
0000000100000de8    movq    %r14,%rsi
0000000100000deb    callq   0x100000e62 # bypasses globalDoStuff() and just prints "Hello world!\n"
0000000100000df0    movq    %rbx,%rdi
0000000100000df3    movq    %r14,%rsi
0000000100000df6    callq   0x100000e62 # bypasses globalDoStuff() and just prints "Hello world!\n"
0000000100000dfb    xorl    %eax,%eax
0000000100000dfd    popq    %rbx
0000000100000dfe    popq    %r14
0000000100000e00    popq    %rbp
0000000100000e01    ret
Run Code Online (Sandbox Code Playgroud)

注意它完全优化了Dummy和,globalDoStuff()并且只是用它的身体替换它globalDoStuff().globalDoStuff()甚至没有Dummy被召唤过,也没有被建造过.相反,编译器/优化器用两个系统调用替换该代码以"Hello world!\n"直接打印出来.经验教训是编译器和优化器非常聪明,通常你不会为你不需要的东西买单.

另一方面,假设你有一个成员函数来操纵一个成员变量Dummy.你可能会认为这与C函数相比有一个代价,对吗?可能不是,因为C函数需要一个指向要修改的对象的指针,当你想到它时,它正是this指针的开始.

所以一般来说,this与C相比,你不会为C++ 支付额外费用.虚拟函数可能会有一个(小)惩罚,因为它必须查找正确的调用函数,但我们在这里考虑的情况并非如此.

如果你没有在你的编译器中打开优化,那么,确定,可能会有一个惩罚,但是...为什么你要比较非优化代码?

  • +1 for*可能不是,因为C函数需要一个指向要修改的对象的指针,当你想到它时,它正是这个指针的开头.*=>没有银弹. (3认同)