我有一个很久以前写过的旧字符串类(在标准库是如此标准之前)。它工作正常,但我想我应该在我的最新项目进入21世纪。我想知道标准库字符串类的效率如何。例如,如果我将一个字符串传递给一个函数或者只是将它分配给另一个函数,它是复制数据,还是只是复制指向数据的指针。
在我的旧课程中,我使用数据保留了引用计数,只是复制了指针。如果我做了一些修改字符串的东西,我会检查它的引用是否为1.如果它是1,我可以使用相同的字符串数据区域,假设字符串没有超过它的原始值尺寸。如果它大于1,我会在修改之前复制字符串数据。
标准库类是否做了类似的事情(或希望更好),或者每次传递字符串时都会复制数据。我想这可能是依赖于实现的。我目前正在为Windows开发,虽然我可能会稍后移植它。感谢
答案 0 :(得分:2)
小型字符串优化已被证明在大多数情况下比COW更有效。虽然这不是一个保证的胜利;它可能在很大程度上取决于它的使用方式。但是我认为你总是可以使用std::shared_ptr<std::string>
来实现你的COW类并为自己节省大量的手动内存管理废话。
底线是,std::string
可能更好,但此处的详细信息可以摆动它。尝试一下,但要小心。
答案 1 :(得分:0)
使用std::string
的臃肿界面,您可以获得复制 - 潜在 - 写入功能,效率低得多。
例如,在char& c = s[i]; c = 'a';
中,如果在c
碰巧共享时需要创建单独的COW项,则bad_alloc
的分配不允许抛出s
。因此,我们必须在s[i]
的每个非const调用中取消共享字符串,只是在这种情况下。
实际上,这限制了共享潜力很多,同时还为许多字符串成员函数添加了大量if (shared) unshare();
代码。在多线程代码中,这是一个真正的性能杀手,因为unshare()
必须在取消共享时锁定对象。