2013-04-11 53 views
0

因此,我在指针方面遇到了一些问题,并找出如何有效地使用它们。指定副本指针

说我有在那里我从堆栈中像这样while循环突然离开“节点”对象的情况下。

while(...) { 
    Node obj = stack.top(); 
    stack.pop(); 
    //do something with the obj 
} 

我想有它运行有效,我不应该创建一个新的节点上每次循环。所以我想这可能是更明智的初始化循环外的节点指针:

Node* obj; 
while(...) { 
    obj = &stack.top(); 
    stack.pop(); 
    //do something with the obj 
} 

然而,当我这样做obj的获取与由于其参考弹出删除...

难道是更有效地创建一个副本,并有指针指向复制或只创建每个迭代都有一个新的节点。告诉我,如果我的思维过程与我的基础一样,我只是想了解有效的方法来实现这一目标。

编辑:这是我测试Dijkstra算法的一部分,在这里我通过很多节点搜索并且运行速度很慢,所以我试图尽可能减少运行时间。

+0

无法猜测创建新节点的相对费用与每次都复制一个现有的 - 特别是因为你没有向我们展示任何有关Node的内容,所以我们没有任何猜测的基础。 – 2013-04-11 03:23:07

回答

1

这实际上取决于它是多么昂贵的复制Node。在您的第一个示例中,您已经制作了top()的副本。这样做通常很好。

但是,如果你发现它昂贵复制Node S(也许通过一些剖析),你可以采用类似shared_ptr这样就可以取得所有权,一旦你做top(),以及随后pop()不仅使stack删除它的所有权Node。那么你只会初始化shared_ptr这应该是相当便宜,如果你有证据表明Node副本是你的速度问题的来源。

如果Node已经分配了成员数据,并且您有一个拷贝构造函数来复制这些分配的数据,那么需要考虑的另一件事是您可以创建一个函数,而不是复制数据,而只是将指针该数据,考虑到你将立即删除Node。在这种情况下复制分配的内存是没有意义的。

通过首先运行profiler可能会更有意义,以确定导致程序运行速度下降的原因,它可能只是随着输入大小缩放而自然减慢,受限于算法实现本身。如果您不确定这是速度慢的原因,那么优化应用程序的这一特定方面可能不值得花费精力和麻烦。

+0

伟大的信息!真的很感激它。相当缺乏经验,所以我甚至不知道探查者是什么。刚刚通过它,41%的用法来自我的C++ stl优先级队列的推送操作。 “minHeap.push(* currentAdjNode)”。 – 2013-04-11 03:47:37

+0

当然没问题,很高兴我能帮上忙。也许你会想创建一个单独的问题来解决这个问题,详细说明你的'Node'的实现(或多或少),以了解它为什么会在那里成为瓶颈。 – 2013-04-11 03:53:05

2

复制和创建指向副本的指针与您的第一个示例大致相同。修复你的第二个例子:

Node* obj; 
while(...) { 
    obj = &stack.top(); 
    // do something with the obj 
    stack.pop(); // do this after processing 
} 

此外,大多数人会认为这是一个微型优化。除非你的课程是巨大的,你已经确定这个特定的片段是一个瓶颈,你可能会更好,不用担心它。

+0

当然,当你可以直接使用引用或更好的'stack.top()'的时候,指针是很愚蠢的。 – Pubby 2013-04-11 03:21:25

+0

是的。它将全部编译成相同的东西无论如何 – Wug 2013-04-11 03:21:59