不必要的对象复制 - C++ STL

Unnecessary object copy - C++ STL

本文关键字:C++ STL 复制 对象 不必要      更新时间:2023-10-16

伙计们,我正在使用标准模板语言,几个月前我开始阅读更多关于它的信息,并实施一些练习。我这里有这段代码:

class Student {
// many attributes and methods here plus:
char* name; // Student name
char* courseName; // Student course name
std::string toString() { return std::string(name); }
}
std::string FindCourseName ( std::list< Student > stu, string name )
{
    for ( std::list< Student >::iterator it = stu.begin();
    it != stu.end();
    it++ )
    {
            if ( (*it).toString() == name )
            {
                return it->courseName;
            }
    }
return "";
}

该练习要求:

a) 在 FindCourseName 方法中完成了多少不必要的对象创建/复制?b) 您将如何减少此副本数量?c) 您将如何优化上面的代码?

我多次阅读此代码,看不到任何不必要的对象副本,你们可以在我的脑海中放一盏灯吗?哈哈哈非常感谢!

  1. 由于两个函数参数按值捕获,因此stuname都是传入事物的副本。这很糟糕。
  2. (*it).toString()复制it->name作为string,但这值得商榷,因为string非常方便,而且很难搞砸,所以这种事情很常见。
  3. it++返回增量之前的副本,但大多数人不计算在内,因为它的优化非常微不足道。
  4. 在 C++03 中,return std::string(name);有时可以创建名称的其他临时字符串副本。 这主要是理论上的,所以很少有人计算。
  5. 由于FindCourseName返回一个string,它复制了返回值作为string,但同样,这是值得商榷的,因为string是好的。

我会根据赋值的请求按以下方式重写函数,前提是类本身不能更改,并且其所有数据成员都是私有的,除非在函数类方法中使用

std::string FindCourseName ( const std::list< Student > &stu, const string &name )
{
    for ( std::list< Student >::const_iterator it = stu.cbegin(), last = stu.cend();
    it != last;
    ++it )
    {
            if ( (*it).toString() == name )
            {
                return it->courseName;
            }
    }
return "";
}

如果数据成员名称是公共的,那么我会写

            if ( (*it).name == name )
            {
                return it->courseName;
            }

尽管由于优化和复制/移动构造函数消除,没有太大区别。