访问指针的速度

eri*_*rip 2 c++ performance pointers

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

这引出了一个问题:

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

Node<T> *temp = head;

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

... // temp used here
Run Code Online (Sandbox Code Playgroud)

我的链表也有一个属性long listSize,所以上面的行是模拟的

if(!listSize) {
   ...
}

... // temp used here, too.
Run Code Online (Sandbox Code Playgroud)

这很明显.对我来说不那么明显的是,对于计算机来说哪一个更快.

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

任何人都可以帮我解决这个细微差别吗?

谢谢,erip

编辑

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

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

das*_*ght 6

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

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

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