2011-11-30 274 views
3

我有一个类:“Class myclass = Class()”是否浪费资源?

class Cat { 
    Cat(); 
    Tail longTail; 
} 

我不知道要写构造为它取之有道。我不想让longTail成为非相关原因的指针。

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

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


问题是

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

多少次创造和尾的复制对象发生的呢?它们对于创建和复制都是CPU昂贵的,我需要数千只猫。在我看来,这个构造函数首先创建长尾默认对象,它创建于分配权NONAME尾部对象后,再运行操作=上长尾和NONAME 。我对吗?如果是的话,我应该如何编写它来保存CPU?我再说一遍:longTail需要一个参数,即在构造函数中计算出来的,并且我不能编辑类。

+1

您是否真的测试过效率问题? –

+0

每个尾都有一个float数组[80] [80],我正在为嵌入式编写。是的,对于我可能编辑的部件的每个CPU周期来说,这是一个问题; –

回答

9

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

为了能够在初始化列表正确的建设,你可以包装参数的计算在一个静态成员函数(因为,如你所说,它仅依赖于静态成员):

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

private: 
    static int calculateLength() {} 
+0

班里面的Cat :: Cat()'? – Nawaz

+0

@Nawaz:复制粘贴错误 - 修复。 –

+0

“caluclateLength”! – curiousguy

0

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

是的。

如果是的话,应该怎么写才能保存CPU?

可能的替代:不分配给longTail,填补longTail到位:

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

你有真实的数据集来测试你的代码?

您是否尝试过配置您的代码?

+1

你认为'Tail'有方法'resize','reserve'和'append' - 怎么样? –

+0

正是这个问题。长度只在构造函数中设置,我不能以任何方式编辑Tail类。 –

+0

猫可能没有包含指针,以致于某些人在'新'操作符中进行内存加密的好主意。 –

相关问题