gpt4 book ai didi

c++ - 使用私有(private)类数据模式的成本是多少?

转载 作者:行者123 更新时间:2023-11-28 06:14:42 25 4
gpt4 key购买 nike

我曾经将其作为库中的 TimeUnit 声明:

方案一:

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,所以我想使用私有(private)类数据模式,从我的头文件中删除任何 boost 引用:

解决方案3:

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

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

TimeUnitPrivate 与 Solution2 的 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 非常聪明,我肯定会节省编译时间 + 限制 boost 依赖项。

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

  • 内存使用情况。 TimeUnit 对象的三种解决方案是否需要相同数量的字节存储在内存中?如果不是,哪个最好(我想是 Solution1)
  • 性能:可以肯定的是,Solution3 的 toString() 会比 Solution2 慢(因为函数不能内联,最后需要额外的函数调用) .这没什么大不了的。但我想知道对象创建/销毁是否会更慢……这三种解决方案在对象创建/销毁的性能方面如何排序?

最佳答案

前两个解决方案在内存使用和性能方面完全相同。一个只是比另一个更客观,纯粹是偏好问题。

handle-body/pimpl idiom 解决方案将占用更多内存(按指针的大小)并且速度较慢(每次调用的额外间接,创建时的额外分配)。慢多少?你得抓紧时间。与编译时间的加速和依赖性的减少相比,额外的内存使用和性能损失是否对您造成伤害?完全取决于您的项目正在做什么。对于某些应用程序,这种规模的性能丝毫不重要,因此加速编译当然值得。对于其他应用程序,这完全是不可能的。没有通用的答案。

关于c++ - 使用私有(private)类数据模式的成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com