视情况而定,但通常,如果您启用了优化,它不应该比 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();
}
使用 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
请注意,它完全优化了Dummy
和globalDoStuff()
,只是将其替换为globalDoStuff()
. globalDoStuff()
甚至没有被调用过,也没有Dummy
被构造过。相反,编译器/优化器用两个系统调用替换该代码以"Hello world!\n"
直接打印出来。教训是编译器和优化器非常聪明,通常你不会为你不需要的东西买单。
另一方面,假设您有一个操作成员变量的成员函数Dummy
。您可能会认为这与 C 函数相比会受到惩罚,对吧?可能不是,因为 C 函数需要一个指向要修改的对象的指针,当您考虑它时,这正是this
指针的开头。
因此,一般而言,与 C 相比,在 C++ 中您不会为 C++ 支付额外费用this
。虚函数可能会受到(小)惩罚,因为它必须查找要调用的正确函数,但这不是我们在这里考虑的情况。
如果您不在编译器中打开优化,那么是的,当然,可能会涉及到惩罚,但是......为什么要比较未优化的代码?