是(*i).成员效率低于i->成员

Kal*_*iwy 11 c++ performance dereference

struct Person {
   string name;
};

Person* p = ...
Run Code Online (Sandbox Code Playgroud)

假设没有运算符过载.


哪个更有效(如果有的话)?

(*p).name p->name

在我脑后的某个地方,我听到一些铃声响起,*取消引用操作员可能会创建一个对象的临时副本; 这是真的?


这个问题的背景是这样的情况:

Person& Person::someFunction(){
    ...
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

我开始怀疑,如果将结果更改为Person*最后一行,只是return this会产生任何差异(性能)?

Luc*_*ore 9

没有区别.即使标准说两者是等价的,如果有任何编译器不会为两个版本生成相同的二进制文件,那么它就是一个糟糕的版本.

  • @KalamarObliwy假设没有运营商超载,是的. (3认同)

Gui*_*i13 8

当您返回引用时,这与传回指针完全相同,排除了指针语义.
你传回一个sizeof(void*)元素,而不是一个sizeof(yourClass).

所以当你这样做时:

Person& Person::someFunction(){
    ...
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

您返回一个引用,该引用具有与指针相同的内在大小,因此没有运行时差异.

您的使用也是如此(*i).name,但在这种情况下,您创建一个l值,它具有与引用相同的语义(另请参见此处)