VC6 STL补丁说明

原文地址:http://www.dinkumware.com/vc_fixes.html

Fix to algorithm

内部函数_Buffered_merge中的两个局部变量未作初始化,VC6已作纠正。

Fix to deque

改动相当大,差不多是重写了整个代码。我未作分析。

Fix to fstream

该BUG主要影响效率,从代码可以看出,只有当_Closef不等于_Openf1时才可能执行后面的_Mysb::_Init,这样对于通过open方式打开一指定文件(函数为_Myt *open(const char *_S, ios_base::openmode _M))则有不好的性能。

Fix to istream

getline函数在处理终止符时存在问题,VC6已作纠正。

Fix to list

sort方法在元素数量大于等于32768时存在问题,测试代码如下:

void test_list()
{
    cout <<  "list::sort test..." << endl;

     list< int> li1, li2;  // 两个list用于比较
    const  int count = 32768;  // 元素数量,>=32768将出现BUG

     vector< int> vi;  // vector用于生成随机序列
    vi.resize(count);
     for( int i=1; i<=count; ++i)
    {
        vi[i-1] = i;
        li1.push_back(i);
    }
    srand( time(0) );
    random_shuffle(vi.rbegin(), vi.rend());
    
     //copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, " "));

    li2.resize(count);
    copy(vi.begin(), vi.end(), li2.begin());
    li2.sort();  // 排序
     //copy(li2.begin(), li2.end(), ostream_iterator<int>(cout, " "));

     bool res = (li1 == li2);  // 比较二者
    cout <<  "  elements_count=" << count <<  ", result=" << res << endl;
}

Fix to memory

auto_ptr在赋值时存在问题,VC6已作纠正。

Fix to sstream

basic_stringbuf::overflow在处理内存增长时太缓慢,严重影响性能。

Fix to string

问题与istream类似,均为getline处理终止符时有问题。我未对该问题做分析,不知道它在什么情况下出现以及有什么后果。

Fix to vector

该问题不明显,我不清楚它在什么情况下会出现。按照其代码,只有当_First或_Last受到意外改写才可能造成问题。

Fix to xmemory

该问题不易出现,属于编译器的BUG。

Fix to xstring

P.J. STL中的的string采用了copy on write和reference counting技术,对于如下代码:

string s1 =  "abc";  // 语句1
string s2 = s1;     // 语句2
s2 =  "123";         // 语句3

在执行语句2时,不会出现两份"abc",而是让s2与s1共享一份内存。

当执行语句3时,s2的值被改写,这时才会单独为其分配内存。

实现这一方式的手段是引用计数,为此,P.J. STL采用了一个巧妙的手段,即在分配内存时多申请了一个字节的空间(位于起始处),这一字节被用作引用计数,由此可知,其计数的最大值只能是255,该值用宏_FROZEN表示。

但是P.J. STL并没有考虑引用计数在多线程环境下的同步问题,因此存在潜在的错误。解决这一问题最简单的办法是将_FROZEN的值改为0,即去掉引用计数功能。而完备的方案则需自己动手实现多线程同步。

Fix to xtree

改动较大,对map、multimap、set和multiset存在影响,未作分析。

(freefalcon于2006-04-11)

你可能感兴趣的:(Algorithm,多线程,String,list,vector,reference)