使用私有类数据模式的成本是多少?

时间:2015-05-31 14:37:13

标签: c++ oop design-patterns private-members

我以前在库中将其作为TimeUnit声明:

解决方法1:

typedef boost::posix::ptime TimeUnit;

TimeUnit createTimeUnit( int hours, int minutes );
std::string toString( const TimeUnit& timeUnit );

让我们说我想把它转移到更加面向对象的东西上:

溶液2:

class TimeUnit : public boost::posix::ptime
{
public:
    TimeUnit( int hours, int minutes );

    std::string toString() const;
};

现在,让我们说我不希望使用这个类的库直接依赖boost,所以我想使用私有类数据模式来删除任何提升引用我的头文件:

Solution3:

class TimeUnitPrivate;
class TimeUnit
{
public:
    TimeUnit( int hours, int minutes );
    ~TimeUnit();

    std::string toString() const;
public:
    TimeUnitPrivate* m_data;
};

TimeUnitPrivate与解决方案2 TimeUnit大致相同,新TimeUnit只是:

TimeUnit::TimeUnit( int hours, int minutes ) : 
    m_data( hours, minutes )
{}

TimeUnit::~TimeUnit()
{
    delete m_data;
}

std::string TimeUnit::toString()
{
    return m_data->toString();
}

Solution3非常聪明,我确保节省编译时间+限制提升依赖性。

但我想知道每个解决方案的成本是多少:

  • 内存使用。 TimeUnit对象的三个解决方案是否需要相同数量的字节存储在内存中?如果没有,哪一个是最好的(我认为它是解决方案1)
  • 效果:当然,Solution3的toString()将比Solution2慢(因为函数不能内联,所以需要额外的函数调用结束)。这不是什么大不了的事。但我想知道对象创建/破坏是否会变慢......这三个解决方案将如何根据对象创建/销毁的性能进行排序?

1 个答案:

答案 0 :(得分:1)

前两个解决方案在内存使用和性能方面完全相同。一个是对象,而不是另一个,纯粹是一个偏好的问题。

handle-body / pimpl idiom解决方案将占用更多内存(按指针的大小)并且速度更慢(每次调用额外的间接,创建时的额外分配)。慢多少?你必须计时。与编译时间的加速和依赖性的降低相比,额外的内存使用和性能是否会对您造成伤害?完全取决于您的项目正在做什么。对于某些应用程序来说,这种规模的性能并不是最重要的,所以它当然值得加速编译。对于其他应用程序,这将是一个完整的非首发。没有普遍的答案。