是否应该使用指针来减少标头依赖性
Should pointers be used to reduce header dependencies?
当创建一个由其他类组成的类时,是否值得通过使用指针而不是值来减少依赖关系(从而减少编译时间)?
例如,下面使用值。
// ThingId.hpp
class ThingId
{
// ...
};
// Thing.hpp
#include "ThingId.hpp"
class Thing
{
public:
Thing(const ThingId& thingId);
private:
ThingId thingId_;
};
// Thing.cpp
#include "Thing.hpp"
Thing::Thing(const ThingId& thingId) :
thingId_(thingId) {}
但是,下面的修改版本使用指针。
// ThingId.hpp
class ThingId
{
// ...
};
// Thing.hpp
class ThingId;
class Thing
{
public:
Thing(const ThingId& thingId);
private:
ThingId* thingId_;
};
// Thing.cpp
#include "ThingId.hpp"
#include "Thing.hpp"
Thing::Thing(const ThingId& thingId) :
thingId_(new ThingId(thingId)) {}
我读过一篇推荐这种方法的文章,但是如果你有大量的指针,就会有大量的new
调用,我想这会很慢。
这就是
大多数人所说的痘痘成语(http://c2.com/cgi/wiki?PimplIdiom)。
简单的答案
我高度怀疑您没有一个好的用例,应该不惜一切代价避免它。
我的经历
Pimpl 对我有用的主要方式是将实现细节设为私有。 它之所以能够实现这一点,是因为您不需要包含依赖项的标头,而只需向前声明其类型即可。
例
如果你想向在后台使用一些提升库代码的人提供一个SDK,但你想选择稍后将其换成其他库,而不会给SDK的使用者带来任何问题,那么Pimpl可以很有意义。
它还有助于在实现上创建外观,以便您可以控制整个公开的公共接口,而不是公开您隐式依赖的库,因此您无法控制并可能更改的整个接口可能会公开太多,可能难以使用等。
如果你的程序不保证动态分配,不要仅仅为了项目组织而引入它。那肯定是一个虚假的经济。
您真正想做的是尝试完全减少类间依赖项的数量。
但是,只要您的耦合是合理的并且像树一样,就不要太担心它。如果你使用的是预编译头(你是,对吧?),那么这些对于编译时间来说都无关紧要。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将成员对象更改为指针以解决循环依赖性
- 是否应该使用指针来减少标头依赖性