我正在重写我在学校学到的所有数据结构作为练习,以加强我对计算机科学基础知识的理解,但我正在尝试优化我年轻时创建的幼稚实现。
这引出了一个问题:
我的链表实现中有这几行,其中两种变体都使用了 temp ...
Node<T> *temp = head;
if(temp == nullptr) {
...
}
... // temp used here
我的链表也有一个属性long listSize
,所以上面这行类似于
if(!listSize) {
...
}
... // temp used here, too.
这是显而易见的。 (对我而言)不太明显的是,对于计算机来说,哪一个会更快。
根据我对指针的(少量)了解,对它们的任何操作都相当昂贵,这使我相信前者可能不如后者最优;但是,我并不完全确定。
谁能帮我解决这个细微差别?
谢谢, 埃里普
编辑
发布此消息后,我决定进行一项实验。我决定第一个实现method2
,第二个实现method1
。我在大小从 10M 到 1B 的对数输入上运行了几次,总的来说,method2
比 method1
快(虽然不多 - 区区 1us)。
经过一番思考,我认为这是有道理的,因为指针在我的体系结构中是 8 字节的,与 long int 的大小相同。因此,与 NULL
的比较应该是一个非常相似的过程,并且可能需要大约相同的时间。
最佳答案
From what (little) I understand about pointers, any operation with them is fairly expensive
这在一般情况下是不正确的:虽然间接级别(即通过指针访问某些东西)确实有成本,但现代硬件将其优化到除了最极端之外你无法分辨的程度个案。积极的缓存使这种差异变得更小,因此将间接访问称为“相当昂贵”是不准确的。
但是,在您的情况下,它甚至比这更简单:根本没有间接寻址!您正在检查指针本身的值,而不是它指向的任何值,因此检查指针和检查长度之间几乎没有区别。一个指针可能是 8 个字节,而长度可能是 4 个字节,但您无法在现代 CPU 上区分时间差异。
关于c++ - 访问指针的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29248388/