传递一个包含动态记忆的类:方法及其效率

Passing a class which holds Dynamic Memory : Methods and their Efficiencies

提问人: 提问时间:1/8/2014 更新时间:1/8/2014 访问量:66

问:

我有一个包含大量数据的类,称为 。这个类遵循三法则(它有 重写 copy-constructor、copy-assignment 运算符和析构函数,以便能够在复制类时正确复制成员变量,并能够在不导致内存泄漏的情况下释放类)。HeavyDatasomeBigAmountOfData

该类有两个类型的成员变量。(见下文)DataManagerHeavyData

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); 方法 1

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

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

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

C++ 内存管理 三法则

评论

1赞 WhozCraig 1/8/2014
也许是一些调试输出来确认/否认你的怀疑。std::cout
1赞 Retired Ninja 1/8/2014
为什么你认为第二个更有效率?
1赞 hansmaad 1/8/2014
使用 std::vector 并遵循零规则。它将添加移动语义,以便您可以将参数移动到HeavyDataHeavyDataDataManager
0赞 1/8/2014
@RetiredNinja 在第一种方法中,被复制两次。首先,当它们传递给构造函数时,然后在成员初始值设定项列表中。onetwo

答:

0赞 jd. 1/8/2014 #1

通过 const 引用传递将避免额外的副本作为堆栈值。但是,构造期间成员变量的赋值也会复制。也许更好:使用shared_ptr来分配你的 HeavyData,并传递它(永远不要一开始就复制它!当然,这取决于我们谈论的重量。

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

0赞 Ravindra Gupta 1/8/2014 #2

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