访问指针的速度

时间:2015-03-25 05:52:39

标签: c++ performance pointers

我正在重写我在学校学到的所有数据结构,以加强我对计算机科学基础知识的理解,但我正在尝试优化我在年轻时创建的幼稚实现。

这引出了一个问题:

我的链表实现中有这几行,其中两个变量都使用了temp ...

Node<T> *temp = head;

if(temp == nullptr) {
    ...
}

... // temp used here

我的链接列表也有一个属性long listSize,因此上面的行与

类似
if(!listSize) {
   ...
}

... // temp used here, too.

这很明显。对我来说不那么明显的是,对于计算机而言,哪一种更快。

从我对指针的理解(很少),使用它们的任何操作都相当昂贵,这使我相信前者可能不如后者更优化;但是,我并不完全确定。

有人可以帮我解决这个细微差别吗?

谢谢, erip

修改

发布后,我决定进行一项实验。我决定进行第一次实施method2和第二次实施method1。我在对数输入上运行了几次,范围从10M到1B,大体上method2method1更快(尽管不是很多 - 差不多1us)。

经过一番思考后,我认为这是有道理的,因为我的架构上的指针是8字节,与long int的大小相同。因此,与NULL的比较应该是一个非常相似的过程,可能需要大约相同的时间。

2 个答案:

答案 0 :(得分:6)

  

从我对指针的理解(很少),使用它们的任何操作都相当昂贵

这一般情况并非如此:虽然间接级别(即通过指针访问某些内容)确实有成本,但现代硬件会优化它以至于除了最极端之外没有办法告诉你案例。积极的缓存使这种差异更小,因此称间接访问“相当昂贵”并不准确。

然而,在你的情况下,它甚至比那更简单:根本没有间接发生!您正在检查指针本身的值,而不是它指向的值,因此检查指针和检查长度几乎没有区别。指针可以是8个字节,而长度可以是4个字节,但是你无法分辨出现代CPU的时间差异。

答案 1 :(得分:1)

我猜两者都是一样的。在两种情况下,您基本上都在进行逻辑比较。指针也是一个变量。它只包含地址,与其他变量位于同一内存区域。

然而,内心深处(装配)第一种情况可能会更慢,因为它使用的是两个变量而不是一个。