提问人: 提问时间:1/8/2014 更新时间:1/8/2014 访问量:66
传递一个包含动态记忆的类:方法及其效率
Passing a class which holds Dynamic Memory : Methods and their Efficiencies
问:
我有一个包含大量数据的类,称为 。这个类遵循三法则(它有
重写 copy-constructor、copy-assignment 运算符和析构函数,以便能够在复制类时正确复制成员变量,并能够在不导致内存泄漏的情况下释放类)。HeavyData
someBigAmountOfData
该类有两个类型的成员变量。(见下文)DataManager
HeavyData
class HeavyData
{
public:
HeavyData();
HeavyData(const HeavyData& that);
HeavyData& operator=(const HeavyData& that);
~HeavyData();
private:
void* someBigAmountOfData; //maybe a few hundred bytes (on the heap, of course)
size_t sizeOfData;
};
class DataManager
{
public:
DataManager();
//method 1
DataManager(HeavyData one, HeavyData two):
one(one),
two(two)
{
}
//method 2 (which I think is more effective than method 1)
DataManager(const HeavyData& one, const HeavyData& two):
one(one),
two(two)
{
}
private:
HeavyData one;
HeavyData two;
};
问题:
该类有两个构造函数,如下所示:DataManager
DataManager(HeavyData one, HeavyData two);
方法 1DataManager(const HeavyData& one, const HeavyData& two);
方法 2
问题在于从上述两个中选择构造函数。你认为哪一个更有效率?为什么 ?
认为第二个构造函数(方法 2)更有效。
答:
0赞
jd.
1/8/2014
#1
通过 const 引用传递将避免额外的副本作为堆栈值。但是,构造期间成员变量的赋值也会复制。也许更好:使用shared_ptr来分配你的 HeavyData,并传递它(永远不要一开始就复制它!当然,这取决于我们谈论的重量。
当然,标准建议适用:两者都尝试,并逐步完成复制。也可以自己衡量性能!
0赞
Ravindra Gupta
1/8/2014
#2
使用指针并按引用传递参数总是比传递值更好。
这样,您将能够使用许多功能,并且还可以避免创建额外的变量。run time polymorphism
HeavyData
评论
std::cout
HeavyData
HeavyData
DataManager
one
two