困惑的返回参考

时间:2012-02-15 22:35:39

标签: c++

我有这两个功能

int FEL::enqueue(Event& new_event){
     getting a reference of an event and add it to an Event array, defined as "Event *event_list"
}

Event FEL::dequeue(){
    Event old_root = event_list[0];
    event_list[0] = event_list[--event_index];
    resort_heap(0);
    return old_root;
}

它工作得很好,但我想修改它以便在出列函数中获得更好的性能。 由于dequeue函数返回Event,我认为如果我只返回事件的引用而不是整个事件结构可能会更好。

如何更改出队函数的返回类型以返回事件的引用? 我想我可以做这样的事情来返回指针,但是如何返回事件的引用(&)?

Event* FEL::dequeue(){
    Event *old_root = &event_list[0];
    event_list[0] = event_list[--event_index];
    resort_heap(0);
    return old_root;
}

1 个答案:

答案 0 :(得分:0)

返回指针将不起作用,因为您正在修改event_list[0]并且old_root是指向该对象的指针,因此它将指向新值而不是旧值。至于返回引用,你也不能,因为返回的值必须是类的成员(或类的成员的元素,依此类推),如果你这样做,你将得到新的值,不是旧的。

如果要返回旧值,唯一的解决方案是按值返回。不过,它可能没有您想象的那么糟糕。大多数编译器都可以应用返回值优化,这意味着不会复制该对象。此外,如果对象包含任何已分配的存储,它可以从C ++ 11上的移动语义中受益。

修改:抱歉,当然还有其他方法可以做到这一点。

void FEL::dequeue(Event *old){
    *old = event_list[0];
    event_list[0] = event_list[--event_index];
    resort_heap(0);
}

请注意,由于上述优化,这可能是一个过早的优化错误。