值和指针之间的分配差异?

时间:2012-07-13 16:59:27

标签: c++

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

MyObject foo = bar.GetObject();

VS

MyObject* foo = bar.GetObjectPtr();

类功能的细节是:

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

第一行中的赋值比第二行慢得多。有人可以解释发生了什么吗?这是否与默认的副本分配有关?

2 个答案:

答案 0 :(得分:5)

具体来说,

  1. 在生成的机器代码中,指针和引用相同, 除了编译器在某些情况下可以做更好的优化 参考感谢减少混叠的乐趣。
  2. 您几乎肯定没有任何表明此行存在问题的分析数据。实际上,该变量在生成的机器代码中甚至可能存在并且是直接访问的。这意味着试图确定其性能是所有相关人员的巨大浪费时间。
  3. 您的微基准代码在执行方面存在严重缺陷。即使是非优化编译器也会为这两行产生相同的结果。如果您已发布基准代码,我可能会更具体。
  4. 发布的代码中的真实问题是提出的大规模封装违规。

答案 1 :(得分:2)

如果您发布的内容确实是您测试的代码,那么您的测试方法肯定存在问题,因为几乎任何现代编译器都会为这两种变体生成相同的代码(当然,没有任何性能差异,当然)。

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