当前位置:  开发笔记 > 编程语言 > 正文

为什么VC++字符串不被引用计数?

如何解决《为什么VC++字符串不被引用计数?》经验,为你挑选了4个好方法。

STL标准不要求从std :: string中重新计算.但事实上,大多数C++实现都提供了refcounted,copy-on-write字符串,允许您将值作为基本类型传递.此外,这些实现(至少g ++)使用原子操作使这些字符串无锁和线程安全.

简单的测试显示了写时复制语义:

#include 
#include 

using namespace std;

void foo(string s)
{
    cout<<(void*)s.c_str()<

在使用非常数成员后,只有两个地址完全打印.

我使用HP,GCC和Intel编译器测试了这段代码,得到了类似的结果 - 字符串可以作为写时复制容器.

另一方面,VC++ 2005清楚地表明每个字符串都是完全复制的.

为什么?

我知道VC++ 6.0中存在一个错误,它具有非线程安全的引用计数实现,导致随机程序崩溃.这是什么原因?他们只是害怕再使用ref-count,即使这是常见的做法?他们宁愿不使用重新计算来解决问题吗?

谢谢



1> Michael Burr..:

我认为越来越多的std::string实现将远离refcounting/copy-on-write,因为它通常是多线程代码中的反优化.

请参阅Herb Sutter的文章"不优化(在多线程世界中)".


从那时起25%的差异变得"差不多"了吗?:)
+1,花了10分钟寻找那个参考.在SO上有很多C++问题,只需要一个指向Herb写作的指针.
实际上,本文清楚地表明使用原子操作的COW字符串与普通COW字符串几乎具有相同的性能.(差异为25%)所以它不是太多的"开销",而且对于做一个真正的复制更加挑衅.

2> Martin York..:

STL实际要求如果使用引用计数,则语义与非引用计数版本相同.这对于一般情况来说并非无足轻重.(这就是为什么你不应该写你的字符串类).

由于以下情况:

std::string   x("This is a string");
char&         x5 = x[5];
std::string   y(x);

x5 = '*';

有关详细信息,请参阅:http://www.sgi.com/tech/stl/string_discussion.html



3> Motti..:

正如Martin&Michael所说,Copy On Write(COW)通常比它的价值更麻烦,为了进一步阅读,请参阅Kelvin Henney关于Mad COW Disease的优秀文章,我相信Andrei Alexandrescu表示小字符串优化表现更好在许多应用程序中(但我找不到文章).

小字符串优化是使字符串对象更大并避免小字符串堆分配的地方.玩具实现看起来像这样:

class string {
    char *begin_, *end_, *capacity_;
    char buff_[64]; // pick optimal size (or template argument)
public:
    string(const char* str)
    {
        size_t len = strlen(str);
        if (len < sizeof(buff_))
        {
            strcpy(buff_, str);
            begin_ = buff_;
            capacity_ = buff_ + sizeof(buff_);
        }
        else
        {
            begin_ = strdup(str);
            capacity_ = begin_ + len;
        }
        end_ = begin_+len;
    }

    ~string()
    {
        if (begin_ != buff_)
            free(begin_); // strdup requires free 
    }
    // ...
};



4> 小智..:

也许Microsoft确定字符串复制不是一个大问题,因为几乎所有的C++代码都尽可能使用传递引用.保持引用计数有空间和时间的开销(忽略锁定),也许他们认为不值得付费.

或者可能不是.如果您对此感兴趣,则应分析应用程序以确定字符串复制是否是主要开销,以及是否切换到其他字符串实现.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有