首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中使用哪些字符串类?

在C++中使用哪些字符串类?
EN

Stack Overflow用户
提问于 2011-01-17 22:55:51
回答 5查看 2.8K关注 0票数 17

我们有一个用C++编写的多线程桌面应用程序。目前开发人员使用CString或std::string,这可能取决于他们的心情。所以我们想选择一个单一的实现(可能不是这两个)。

MFC的CString基于写时复制(COW)习惯用法,有些人可能会说这在多线程环境中是不可接受的(可能还会引用this article)。我不相信这样的说法,因为原子计数器似乎相当快,而且这种开销在某种程度上被内存重新分配的减少所补偿。

我了解到std::string的实现依赖于编译器-它不是MSVC中的COW,但它是,或者说曾经是在gcc中。据我所知,新的C++0x标准将通过要求非COW实现来解决这个问题,并解决一些其他问题,例如连续缓冲区要求。所以实际上std::string在这一点上看起来并没有很好的定义...

我不喜欢std::string的一个简单例子:在没有过多重新分配的情况下,无法从函数返回字符串(如果按值返回,则复制构造函数,并且无法访问内部缓冲区来优化它,因此“按引用返回”,例如std::string& Result不起作用)。我可以通过按值返回(由于COW而没有副本)或通过引用传递并直接访问缓冲区来使用CString来完成此操作。同样,C++0x通过它的右值引用来拯救,但我们不会在最近的功能中使用C++0x。

我们应该使用哪个字符串类?奶牛真的会成为一个问题吗?还有没有其他常用的高效字符串实现?谢谢。

编辑:我们目前不使用unicode,也不太可能需要它。然而,如果有什么东西可以很容易地支持unicode (而不是以ICU的成本为代价),那就更好了。

EN

回答 5

Stack Overflow用户

发布于 2011-01-17 23:17:42

实际上,答案可能是“视情况而定”。但是,如果你使用的是MFC,IMHO,CString的使用会更好。此外,您还可以将CString与STL容器一起使用。但是,这将导致另一个问题,我应该在CString中使用stl容器还是MFC容器?使用CString将为您的应用程序提供敏捷性,例如在unicode转换中。

编辑:此外,如果您使用WIN32接口调用,CString转换将会更容易。

编辑: CString有一个GetBuffer()和CString方法,允许您直接修改缓冲区。

编辑:我在SQLite包装器中使用了CString,格式化CString更容易。

代码语言:javascript
复制
    bool RS::getString(int idx, CString& a_value) {

//bla bla

        if(getDB()->getEncoding() == IDatabase::UTF8){
            a_value.Format(_T("%s"), sqlite3_column_text(getCommand()->getStatement(), idx));
        }else{
            a_value.Format(_T("%s"), sqlite3_column_text16(getCommand()->getStatement(), idx));
        }
        return true;
}
票数 5
EN

Stack Overflow用户

发布于 2011-01-17 23:19:45

我不知道其他常见的字符串实现-它们都受到C++03中相同语言的限制。要么它们提供了一些特定的东西,比如ICU组件对于Unicode来说是多么的伟大,它们真的像CString一样古老,或者std::string胜过它们。

但是,您可以使用MSVC9 SP1 STL使用的相同技术-即"swaptimization",这是有史以来最有趣的命名优化。

代码语言:javascript
复制
void func(std::string& ref) {
    std::string retval;
    // ...
    std::swap(ref, retval); // No copying done here.
}

如果您使用的自定义字符串类在其默认构造函数中没有分配任何内容(或者检查了您的STL实现),那么交换优化它将保证没有多余的分配。例如,我的MSVC STL使用SSO,默认情况下不分配任何堆内存,因此通过交换上面的内存,我不会获得多余的分配。

您也可以通过不使用昂贵的堆分配来显著提高性能。有些分配器是为临时分配而设计的,您可以使用自定义的分配器替换您最喜欢的STL实现中使用的分配器。您可以从Boost或roll内存竞技场获得像对象池这样的东西。与普通的新分配相比,您可以获得10倍的性能。

票数 1
EN

Stack Overflow用户

发布于 2011-01-18 01:03:39

我建议做一个“每个DLL”的决定。如果您有严重依赖于MFC的DLL(例如,您的GUI层),而您需要大量带有CString参数的MFC调用,请使用CString。如果您的DLL中只有CString类要使用,那么请改用std::string。当然,您需要两个类之间的转换函数,但我怀疑您已经解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4714494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档