0

我有一个包含大量数据的类,称为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有两个构造函数,如下所示:

  1. DataManager(HeavyData one, HeavyData two); //方法一

  2. DataManager(const HeavyData& one, const HeavyData& two); //方法二

问题在于从上述两个中选择一个构造函数。你觉得哪一个更有效率?为什么?

认为第二个构造函数(方法2)更有效。

4

2 回答 2

0

使用指针并通过引用传递参数总是比传递值更好。这样,您将能够使用的许多功能,run time polymorphism并且还避免创建额外的HeavyData变量。

于 2014-01-08T10:44:10.120 回答
0

通过 const 引用传递将避免作为堆栈值的额外副本。但是,在构造过程中分配成员变量也会复制。也许更好:使用 shared_ptr 分配您的 HeavyData,然后将其传递(从不复制它开始!)。当然,这取决于我们所说的Heavy。

当然,标准建议适用:尝试两者,然后逐步完成复制。自己也测量性能!

于 2014-01-08T10:30:27.283 回答