1

我有以下代码:

void Stack::operator =(Stack &rhs)
{
    //do the actual copying
}

Stack::Stack(Stack &rhs) //copy-constructor
{
    top=NULL; //initialize this as an empty stack (which it is)
    *this=rhs; //invoke assignment operator
}

Stack& Stack::CopyStack()
{
    return *this; //this statement will invoke copy contructor
}

它是这样使用的:

unsigned Stack::count()
{
    unsigned c=0;
    Stack copy=CopyStack();
    while (!copy.empty())
    {
        copy.pop();
        c++;
    }
    return c;
}

从 CopyStack 的声明中删除引用符号(返回副本而不是引用)在 Visual Studio 2008 中没有区别(关于调用复制的次数)。我猜它会被优化掉——通常它应该首先为返回值制作一个副本,然后再次调用赋值运算符将它分配给变量 sc。

您对不同编译器中的这种优化有何经验?

问候, 泽南

4

3 回答 3

2

此语句是从 的返回值Stack调用的复制初始化。没有任务。copyCopyStack()

Stack copy=CopyStack();

在此函数中,注释不正确。没有调用复制构造函数,因为返回值是一个引用。

Stack& Stack::CopyStack()
{
    return *this; //this statement will invoke copy contructor
}

这意味着原始初始化实际上是从*this变量复制构造。

如果返回值是值,那么复制初始化将来自一个临时的,但编译器可以有效地消除它。

我看不到CopyStack函数的重点。只执行直接初始化会更惯用:

Stack copy(*this);
于 2010-04-03T15:18:24.983 回答
0

如果我理解正确,您可以对堆栈对象进行原型化并返回原型,这可能会带来一些性能,但您必须注意内存资源的对象所有权。

如果您愿意,可以使用原型工厂设计模式。

于 2010-04-03T16:16:11.257 回答
0

我猜您正在寻找的是 RVO(返回值优化)和 NRVO(命名返回值优化)。编译器优化是一个庞大的主题,如果我要开始输入描述,那将花费太长时间!只需查看此博客文章...它很好地解释了它。

于 2010-04-03T16:17:47.757 回答