“class myclass = Class()”会浪费资源吗?

时间:2011-11-30 07:55:07

标签: c++ resources constructor

我有一个班级:

class Cat {
   Cat();
   Tail longTail;
}

我不确定为它编写构造函数的正确方法。我不想让longTail成为非相关原因的指针。

Cat::Cat() : longTail(length) {...} 

那个不适合因为长度是在构造函数中计算的,基于创建时的静态成员值; (上游不良做法);


问题是

Cat::Cat() 
{
   int length;
   ...
   longTail = Tail(length);
}

Tail 对象的创建和复制发生了多少次?它们对于创建和复制都是昂贵的CPU,我需要数千只猫。在我看来,这个构造函数首先在 longTail 中创建一个默认的 Tail 对象,然后在赋值右侧创建noname Tail对象,然后在上运行operator = > longTail 和noname Tail 。我对吗?如果是,我该如何编写它以保留CPU?我再说一遍: longTail 需要一个在构造函数中计算的参数,我无法编辑 Tail 类。

2 个答案:

答案 0 :(得分:8)

在您的第二个版本中,您的Tail - 对象将在构造函数体运行之前进行默认初始化。在正文中,您创建第二个Tail - 对象并将其分配给第一个。

要在初始化列表中启用正确的构造,可以将参数的计算包装在静态成员函数中(因为,正如您所说,它仅取决于静态成员):

class Cat {
public:
    Cat() : longTail(calculateLength()) {...} 

private:
    static int calculateLength() {}

答案 1 :(得分:0)

  

在我看来,这个构造函数首先在longTail中创建一个默认的Tail对象,然后在赋值的右边创建noname Tail对象,然后在longTail和noname Tail上运行operator =。我是对的吗?

  

如果是,我该如何编写它以保留CPU?

可能的选择:不要分配到longTail,填写longTail

longTail.resize (length);
// or
longTail.reserve (length);
longTail.append (x).

您是否拥有可用于测试代码的实际数据集?

您是否尝试过分析代码?