Copy-on-Write策略在std::string中的历史与问题
为什么早期C++标准库实现中std::string采用Copy-on-Write(写时拷贝)策略?COW机制如何工作?为什么C++11后被弃用?它存在哪些线程安全和语义问题?
回答
编译有声
COW(写时拷贝):多个string对象共享同一底层字符缓冲区,通过引用计数跟踪共享量。读操作共享,写操作(如operator[]返回非const引用)时先拷贝再修改。优点:减少大量字符串拷贝(尤其传参)。存在问题:1)线程安全—引用计数需要原子操作,性能下降严重;2)语义违反C++11要求——C++11规定operator[]返回的引用/迭代器在下次修改前必须有效,但COW的写时拷贝会使已有引用失效;3)非const的operator[]无法区分读/写意图,只能假设为写操作触发拷贝;4)多线程环境下大量原子操作甚至超过拷贝开销。C++11标准明确要求string不能是COW实现。现代方案:SSO(短字符串) + 非共享分配(长字符串)。