【问题标题】:When accessing a pointer to an array why is &myArrayPtr[0] faster than myArrayPtr.get()?在访问指向数组的指针时,为什么 &myArrayPtr[0] 比 myArrayPtr.get() 快?
【发布时间】:2017-11-07 04:46:47
【问题描述】:

我有一个指向“类型”数组的唯一指针,似乎通过以下方式访问指向该数组第一个元素的指针:

&myArrayPtr[0];

比:

myArrayPtr.get();

考虑到这些操作都定义了std::unique_ptr([]操作符和get(),而且结果是一样的,那么这些“幕后”的实现方式有什么不同吗?似乎有大约的区别10 纳秒。

std::unique_ptr<int[]> myArrayPtr;
uint64_t number_of_elements = 1000;
myArrayPtr.reset(new int[number_of_elements]);

&myArrayPtr[0];

myArrayPtr.get();

【问题讨论】:

  • 为什么不检查组件并找出答案?提供有关您的微基准的完整详细信息也是一个好主意。当你直接访问它时,当然没有方法调用。
  • 在上面的例子中显然不是问题,但是...&amp;myArrayPtr[0]; = Kaboom 如果myArrayPtr 为空。 get(),没那么多。
  • Godbolt 试用您的代码。开启优化(gcc 和 clang,使用 -O2)时,似乎两种方式都会生成相同的程序集。你是如何编译/测量的?
  • 哎呀...我搞砸了,它们是一样的,抱歉给您带来麻烦。

标签: c++ arrays performance


【解决方案1】:

这不是您问题的直接答案。我认为只有四件事与您的问题有关:

  1. 标准库的std::unique_ptr 的实现在&lt;memory&gt; 标头中一目了然,您可以检查一下,看看两者之间到底有什么不同。或者至少在这里发布它们;这是必需的信息。

  2. 编译器生成的汇编代码将是寻找这些速度小波动的终极场所。让编译器生成汇编程序以及(或代替)目标文件并仔细阅读它并不难。或者至少在这里发布它们;这是必需的信息。

  3. 纳秒级的速度差异很可能在很大程度上取决于您的确切 CPU 架构和型号,更不用说编译器细节和命令行开关了。您应该在问题中包含这些内容。

  4. 纳秒级的速度差异在很大程度上取决于您的基准测试方法。您是否使用足够精确和准确的计时器?您是否重复实验足够多次以对您的结果和误差范围充满信心?你知道你的误差范围吗?您是否正确预热 CPU 管道和缓存?您是否考虑了操作系统干扰和上下文切换?还有其他一些我能想到的事情(无论如何我都不是这方面的专家。)你应该描述你的方法或发布你的完整源代码,让你相信你所相信的.

无论如何,为了给您一个答案(我承认这还不够),从您提到的unique_ptr 中获取地址的两种方法很可能并没有什么不同。如果您不生成调试代码并进行适当的内联,它们可能会生成完全相同的代码(基本上只不过是 LEA 或 x86 上的其他内容)。

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多