【发布时间】:2010-04-03 15:10:04
【问题描述】:
我有以下代码:
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。
您对不同编译器中的这种优化有何经验?
问候, 哲南
【问题讨论】:
-
旁白:您的复制构造函数和
operator =应该使用const引用。 -
这实际上是一个非常简单的作业——一个只有 119 行实现的类。每个方法最多被调用几次,并且永远不会被扩展。问这个问题的原因是它在 C++ 教科书中得到了广泛的关注。在这个程序中,性能不是任何问题——复制堆栈只使用 push 和 pop 方法实现——这使得它非常低效。并且计数本来可以作为私有变量保存,等等。
-
您的问题实际上是:“实际上,编译器是否消除了使用复制初始化的定义中的临时变量?”,因为代码中的注释似乎显示了误解关于作为返回值的引用。
-
好吧,当我写那条评论时,我希望临时被复制。后来我发现编译后的代码是按照我想要的方式优化的。
标签: c++ copy containers compiler-optimization