当访问指向数组的指针时,为什么& myArrayPtr [0]比myArrayPtr.get()更快?

时间:2017-11-07 04:46:48

标签: c++ arrays performance

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

&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();

1 个答案:

答案 0 :(得分:0)

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

  1. 您的标准库std::unique_ptr的实现位于<memory>标题中,您可以查看它以确切了解两者之间的不同之处。或者至少在这里发布;这是必需的信息。

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

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

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

  5. 无论如何,为了给你一个相似的答案(我承认这是不够的),从你提到的unique_ptr中获取地址的两种方法很可能完全不同。如果您不生成调试代码并进行正确的内联,它们可能会生成完全相同的代码(基本上只是LEA或x86上的某些内容)。