-2

当我执行以下操作时,我在紧密循环中看到了巨大的性能差异:

MyObject foo = bar.GetObject();

对比

MyObject* foo = bar.GetObjectPtr();

类函数的细节是:

class MyClass
{
  MyObject someobject;
  MyObject& GetObject() { return someobject; }
  MyObject* GetObjectPtr() { return &someobject; }
} bar;

第一行的分配比第二行慢得多。有人可以解释发生了什么吗?这与默认复制分配有关吗?

4

2 回答 2

5

具体来说,

  1. 指针和引用在生成的机器代码中是相同的,除了由于较少的别名乐趣,编译器在某些情况下可以对引用进行更好的优化。
  2. 您几乎可以肯定没有任何分析数据表明这条线是一个问题。事实上,该变量可能甚至不存在于生成的机器代码中,而是直接访问的。这意味着试图确定其性能对于所有相关人员来说都是浪费时间。
  3. 您的微基准代码在执行方面存在严重缺陷。即使是非优化编译器也会为这两行产生相同的结果。如果您发布了基准代码,我可能会更具体。

发布的代码中的真正问题是出现的大量封装违规。

于 2012-07-13T17:02:39.360 回答
2

如果您发布的确实是您测试的代码,那么您的测试方法一定有问题,因为几乎任何现代编译器都会为两种变体生成相同的代码(当然不会导致任何类型的性能差异)。

如果您正在测试其他内容,则必须提供有关测试的更多详细信息。

于 2012-07-13T17:06:23.527 回答