我以前在库中将其作为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非常聪明,我确保节省编译时间+限制提升依赖性。
但我想知道每个解决方案的成本是多少:
toString()
将比Solution2慢(因为函数不能内联,所以需要额外的函数调用结束)。这不是什么大不了的事。但我想知道对象创建/破坏是否会变慢......这三个解决方案将如何根据对象创建/销毁的性能进行排序?答案 0 :(得分:1)
前两个解决方案在内存使用和性能方面完全相同。一个是对象,而不是另一个,纯粹是一个偏好的问题。
handle-body / pimpl idiom解决方案将占用更多内存(按指针的大小)并且速度更慢(每次调用额外的间接,创建时的额外分配)。慢多少?你必须计时。与编译时间的加速和依赖性的降低相比,额外的内存使用和性能是否会对您造成伤害?完全取决于您的项目正在做什么。对于某些应用程序来说,这种规模的性能并不是最重要的,所以它当然值得加速编译。对于其他应用程序,这将是一个完整的非首发。没有普遍的答案。