我们有一个 C++ (MFC) 中的多线程桌面应用程序。目前开发人员使用 CString 或 std::string,可能取决于他们的心情。所以我们想选择一个实现(可能不是这两个)。
MFC 的 CString 基于写时复制 (COW) 习语,有些人会声称这在多线程环境中是不可接受的(可能参考本文)。我不相信这种说法,因为原子计数器似乎相当快,而且这种开销以某种方式通过减少内存重新分配来补偿。
我了解到 std::string 的实现取决于编译器——它不是 MSVC 中的 COW,但它是,或者在 gcc 中。据我了解,新的 C++0x 标准将通过要求非 COW 实现来解决此问题,并解决一些其他问题,例如连续缓冲区要求。所以实际上 std::string 在这一点上看起来没有很好的定义......
一个我不喜欢 std::string 的简单示例:如果没有过多的重新分配,就无法从函数返回字符串(如果按值返回,则复制构造函数,并且无法访问内部缓冲区来优化它,所以“返回通过参考”例如std::string& Result
没有帮助)。我可以通过按值返回(由于 COW 没有复制)或按引用传递并直接访问缓冲区来使用 CString 执行此操作。再一次,C++0x 用它的右值引用来拯救,但我们不会在最近的特性中使用 C++0x。
我们应该使用哪个字符串类?COW真的会成为问题吗?还有其他常用的有效字符串实现吗?谢谢。
编辑:我们目前不使用 unicode,我们不太可能需要它。但是,如果有一些容易支持 unicode 的东西(而不是以 ICU 为代价......),那将是一个加号。