箭头解引用p->m
是(*p).m
的语法糖,它看起来像它可能涉及两个单独的内存查找操作 - 一个找到堆上的对象,第二个找到成员字段偏移。C++重复箭头操作符解引用性能vs点运算符
这让我质疑这两个代码片段之间是否存在任何性能差异。假设classA
具有30+需要被以各种顺序访问(不一定连续或连续地)的各种类型的不同字段:1
版本:
void func(classA* ptr)
{
std::string s = ptr->field1;
int i = ptr->field2;
float f = ptr->field3;
// etc...
}
2版本:
void func(classA* ptr)
{
classA &a = *ptr;
std::string s = a.field1;
int i = a.field2;
float f = a.field3;
// etc...
}
所以我的问题是这两个版本之间是否存在性能差异(即使非常小),或者如果编译器是s (即使不同的字段访问被它们之间的许多其他代码行中断,我没有在这里显示)。
如果没有人知道答案,我将不得不微调自己的基准。不过,我希望将来可以为其他人提供答案。 –
测量它...或者比较程序集的输出,你甚至可以在线完成https://gcc.godbolt.org/ – StoryTeller
好吧,只要你自己找到答案就可以了您的代码或使用分析器。 – johnbakers