我刚看到this很好的写时复制指针实现。它看起来非常通用和有用,所以我的问题是:这样的类是否包含在任何C ++工具包(boost,loki等)中?如果没有,我真的想知道为什么,因为它是一个非常有用的习惯用语,显然一个通用的实现似乎可行(就像我链接的那个)。
答案 0 :(得分:6)
关于这种可能性存在很多争论,并且至少有一个最终作为auto_ptr
出现的建议版本用于引用计数COW指针。
不幸的是,COW的时间已经过去了。使COW指针(或COW-无论如何)线程安全可以引入严重的performance problems。
编辑:重读一下,我觉得有必要指出,所有使用COW必然是过时的。有时它仍然有意义。线程安全增量的开销几乎是固定的 - 所以它只是一个对象必须有多大的问题,或复制的成本,COW才有意义。还有时间/地点你有很多的(未修改的)对象的副本,并且内存节省可以是一个合理的权衡 - 内存的节省证明了一些额外的处理器时间。如果您可以将 little 数据分页到磁盘或从磁盘中分页,那么您可以赶紧提前。
答案 1 :(得分:2)
就像Jerry Coffin所说,已经证明COW成语引入了性能问题......但实际上存在另一个问题。
实际编写COW的通用实现是不可能的(如您链接的文章所示)。在std::string
的COW实现中,只要调用将实际修改字符串状态的操作,就会执行复制。但是,指针应该如何知道呢?它对所指出的课程一无所知。
例如,我们假设我这样做:
void method(Foo& foo, flag_t flag)
{
if (flag == flag::Yes) foo.modify();
}
void invoke(COWPointer<Foo> ptr)
{
method(*ptr, flag::No);
}
Oups!我复制了Foo
对象,即使它不会被修改!
问题在于,虽然这个COW类有帮助,但实际上你必须包装它:
class Foo
{
public:
private:
COWPointer<FooImpl> mImpl;
};
然后真正修改对象的Foo方法将负责复制FooImpl
状态。所以确保课程有所帮助,但它也不是银弹。
所有这些麻烦......由于MT应用程序中的同步问题而无法确定实际获得性能......
实际上尽可能避免复制(使用引用/指针)而不是在某些情况下调整你的类以获得可能的增益并不会使已经处理过性能问题的用户受到惩罚?
答案 2 :(得分:0)
“指针”和“写入时复制”之间存在矛盾:根据定义,取消引用指针不会改变它,更改*p
不会改变p
。
因此可以取消引用const指针,并且可以修改生成的左值。
你真的在谈论一个单元素容器,而不是一个指针。