String写时拷贝实现

头文件部分 1 /*
 2 版权信息:狼
 3 文件名称:String.h
 4 文件标识:
 5 摘    要:对于上版本简易的String进行优化跟进。
 6         改进
 7         1.(将小块内存问题与大块分别对待)小内存块每个对象都有,当内存需求大于定义大小时利用动态分配
 8         2.实现大块内存的写时拷贝功能,提高效率,优化空间利用
 9         3.类似new[]实现机制:将动态内存块大小信息保存为隐藏“头”
10 
11 当前版本:1.2
12 修 改 者:狼
13 完成日期:2015-12-12
14 
15 取代版本:1.1
16 原 作 者:狼
17 完成日期:2015-12-11
18 */
19 #ifndef _STRING_H
20 #define _STRING_H
21 #include<iostream>
22 using namespace ::std;
23 
24 namespace COW
25 {
26     class String
27     {
28     friend     void Check_Interface(String &S);
29     friend ostream& operator << (ostream&os, String &Str);
30 
31     public:
32         String(const char* str = "");
33         String(String& Str);
34         String& operator=(const String& Str);
35         ~String();
36 
37     private:
38         void decrease();//减少引用计数。
39         void increase();//增加引用计数。
40 
41     private:
42         enum{BufSize = 16};        //利用枚举进行数组初始化
43         char *_str;                //内容块,“头”代替capacity
44         char _buff[BufSize];    //小内存块处理。
45     };
46     ostream& operator << (ostream&os, String &Str);
47 }
48 #endif
///////////////实现文件#include"String.h"
#pragma warning (disable:4351 4996)

using namespace COW;

String::String(const char *Str)
    :_str(NULL)
    , _buff()
{
    //采用动态分配
    if (strlen(Str) >= BufSize)
    {
        _str = new char[strlen(Str) + 5];

        *((int*)_str) = 1;

        strcpy(_str + 4, Str);
    }
    else//栈内存储
    {
        strcpy(_buff, Str);
    }
}
String::String(String& Str)
    :_str(NULL)
    , _buff()
{
    //    1.如果是小块内存。浅拷贝
    if (Str._str == NULL)
    {
        strcpy(_buff,Str._buff);
    }
    else
    {
        _str = Str._str;
        this->increase();
    }
}
String& String::operator=(const String& Str)
{
    //都是动态 且指向一处
    if (_str == Str._str&&_str != NULL)
        return *this;

    //两个都是小内存时
    if (Str._str == NULL&&_str==NULL)
    {
        strcpy(_buff, Str._buff);
    }
    //如果*this 是小内存(不存在内存变更,不用处理buff),Str 动态。
    else if (_str==NULL&&Str._str!=NULL)
    {
        _str = Str._str;
        this->increase();
    }

    //*this 动态,Str小内存。减少*this._str计数。。.更改buff
    else if(_str!=NULL&&Str._str==NULL)
    {
        this->decrease();
        _str = NULL;
        strcpy(_buff,Str._buff);
    }

    //两个都是动态分配 但不同
    else
    {
        this->decrease();
        _str = Str._str;
        this->increase();
    }
    return *this;
}
void String::increase()
{
    *(int*)_str += 1;
}
void String::decrease()
{
    if (_str != NULL)
    {

        //////问题2,,每次decrease之后必须变更_str..为NULL或者指向新块
        if ((*(int*)_str) - 1 != 0)
        {
            (*(int*)_str) -= 1;
        }
        else
        {
            delete[]_str;
            _str = NULL;
        }
    }
}
String::~String()
{
    this->decrease();
    _str = NULL;
}

///////问题1...命名空间冲突时
ostream& COW::operator << (ostream&os, String &Str)
{
    if (Str._str)
    {
        os << (Str._str + 4) << "t"<< (*(int*)Str._str);
    }
    else
        os << Str._buff;
    return os;
}
//////friend 友员函数不能跨越命名空间访问私有成员????????????
//void Check_Interface(COW::String &S)
//{
//    //char  COW::String::*ch = S._str;
//    char *ch = S._str;
//    cout << endl;
//}
/////////////测试模块#include"String.h"
using namespace COW;

void Test_COPY_EPU()
{

    String S1("hellow     world!");
    String S2("hellow world");
    String S3;
    S3 = S2;
    String S4;
    S4 = S1;
    //少对多,少对少
    cout << "小内存赋值" << S3 << endl;
    cout << "小内存赋值" << S4 << endl;

    //多对多,多对少
    String S5("change             world");
    S5 = S1;
    cout << S5 << endl;
    S5 = S2;
    cout << S5 << endl;
    //多多且等
    String S6 = S1;
    S6 = S1;
    cout << S6 << endl;
}
void main()
{
    Test_COPY_EPU();
}

String写时拷贝实现
原文链接: https://www.cnblogs.com/lang5230/p/StringCOW.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/225750

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午12:55
下一篇 2023年2月13日 下午12:56

相关推荐