12.string_vector(上)
简单看看第一个是utf16编码下一个是utf32编码
他们的长度也是不一样的。utf8是一个字节为单位,一个汉字占两个,加斜杠0占五个两个字节一个单位,两个字节为一个单位,最少占用两个字节,2*3,4*3,了解一下
也有可能互相转换,两个库还互相转,
wide char是宽字符不确定几个字节 string对应窄字符,确定是八个字节,比如说long不同平台占用的字节不同,确定的是wide char 在windows是两个字节,跟char16_t功能是重叠的, 存utf16
widechar 存字符串也是过不去的,要加个L

认识一下,了解看到对应开头就要知道什么编码。、
basic string 是一个模版存不同类型字符串.string 只是存char的
深拷贝还有一种写法类似让别人帮我干活,让别人帮我拷贝,现代写法:
如果我的str是随机值给tmp会有风险,所以在给可以给点缺省值
如果是随机值,tmp是临时对象,释放的时候,就是野指针,出错。
交换我们可以单独写个交换函数:两个string 交换直接交换成员编不过
他会认为参数不匹配,因为先找的就是这个函数,这里要用算法库里的
这样更简洁,this (s2)和tmp交换。
这里要保证缺省值是nullptr,不然出问题,
this 再调用swap
delete空没问题但是如果这里是随机值,那么tmp析构时候就有问题了.\
free和delete对空都做了特殊处理,可以
首先要把自己的值释放,,tmp先把s3拷贝,this 也就是s1跟tmp交换
tmp出了作用域又把这块空间释放析构了,
赋值还可以再变形:
以后用着几种方法写,拷贝构造必须引用,赋值不用,tmp就跟s3有一样大空间一样大值,一换,一销就搞定。

为什么还要自己整个swap,,传统swap交换是构造,s1拷贝构造一个c深拷贝,b就是s2,赋值给s1这又是一次深拷贝,,再赋值,共三次深拷贝,代价大,
日期类还行,深拷贝的不行所以自己写个,自己写的,调算法库实例化三个都是内置类型,因为模版是string 类型,而这是char*指针和——size _capacity ,C++98更推荐下面的方式
这些也不用担心,库里老早就考虑好了,全局这块写了个全局swap
这有个模版版本还有个实例化版本,调用时候调用已经写好的,优先调用下面的,,还是直接调用。不用深拷贝。
所以这两种方式效率是一样的。(自己写的和系统的)引用计数了解。
浅拷贝的问题:
,所以加引用计数,前几个对象只--计数,最后一个才释放
s2如果要修改,计数不是1,我要做深拷贝计数减减,减到1,然后指向我的资源 ,然后修改
引用计数谁写谁再进行拷贝。最终还要深拷贝,为啥不最开始就深拷贝,不是每个场景就会写,
博弈:如果拷贝后,不写是不是就赚了。

考虑优化,直接拷贝构造,是深拷贝,最后还要销毁,这里再看一下我们的方案:str要拷贝ret要浅拷贝,引用计数1变2,出了作用域str销毁,2减到1.,提高效率了
如果后面写了,这两个方案效率一样,这个方案在现在逐渐pass了。
string 有指针 size capacity 还有个16个字节的buffer 所以总共28字节。
这是引用计数写时拷贝里面要由加这个函数
然后拷贝构造按引用计数方式实现

这是结构体内有个指针 指针指向空间,柔性数组是一次nalloc,malloc结构体,数组和结构体是一块空间,数组不够了还要扩,
G++string里面只有一个指针,先存size capacity 和引用计数,s1对象只有一个指针,他是四个字节或者八个字节,指向这块哦空间,类似柔性数组,结构和后面空间放到一起
那这我要怎么找到数组的问题,指针ptr加12字节就到这个位置了,就可以访问了,所以G++是八字节,倩倩了解一下。
