当前位置: 首页 > news >正文

专业的聊城做网站费用dz网站模版

专业的聊城做网站费用,dz网站模版,广东东莞人才网,php网站模板开源http://blog.csdn.net/SuLiJuan66/article/details/48882303 Copy On Write Copy On Write(写时复制)使用了“引用计数”#xff08;reference counting#xff09;#xff0c;会有一个变量用于保存引用的数量。当第一个类构造时#xff0c;string的构造函数会根据传入的参…http://blog.csdn.net/SuLiJuan66/article/details/48882303 Copy On Write Copy On Write(写时复制)使用了“引用计数”reference counting会有一个变量用于保存引用的数量。当第一个类构造时string的构造函数会根据传入的参数从堆上分配内存当有其它类需要这块内存时这个计数为自动累加当有类析构时这个计数会减一直到最后一个类析构时此时的引用计数为1或是0。此时程序才会真正的Free这块从堆上分配的内存。 写时复制Copy-On-Write技术就是编程界“懒惰行为”——拖延战术的产物。举个例子比如我们有个程序要写文件不断地根据网络传来的数据写如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操 作的话都简直就是性能上巨大的损失因此通常的做法是每次写文件操作都写在特定大小的一块内存中磁盘缓存只有当我们关闭文件时才写到磁盘上 这就是为什么如果文件不关闭所写的东西会丢失的原因。 class String { public:String(char* ptr ) //构造函数:_ptr(new char[strlen(ptr)1]){strcpy(_ptr, ptr);}String(const String s):_ptr(new char[strlen(s._ptr)1])//另外开辟空间{strcpy(_ptr, s._ptr);}~String(){if (_ptr){delete[] _ptr;}} private:char* _ptr; };1234567891011121314151617181920212223 void Test() {String s1 hello world;int begin GetTickCount();//记录此时毫秒数for (int i 0; i 10000; i){String s2 s1;}int end GetTickCount();//记录此时毫秒数cout cost time: end - begin endl; }1234567891011 GetTickCount : 在Release版本中该函数从0开始计时返回自设备启动后的毫秒数不含系统暂停时间。在头文件windows.h中。 在上面for循环中语句“String s2 s1;”不断调用拷贝构造函数为s2开辟空间执行完语句“String s2 s1;”后不断调用析构函数对s2进行释放导致低效率Test执行结果如下图 写时拷贝~~写时拷贝~自然是我们自己想写的时候再进行拷贝复制下面引入几种方案如下试着判断哪一种方案可行 这里又引入另外一个概念“引用计数”string的构造函数会根据传入的参数从堆上分配内存当有其它类需要这块内存时即其它对象也指向这块内存这个计数为自动累加上面方案中的_retCount就是用来计数的。 简单地介绍一下上面三个方案。方案一和方案二是不可行的方案一中的_retCount是属于每个对象内部的成员当有多个对象同时指向同一块空间时_retCount无法记录多个对象方案二中的_retCount是静态成员变量是所有对象所共有似乎可以记录举个例子对象s1、s2指向A空间_retCount为2对象s3、s4指向B空间此时_retCount变为4但是当想释放B空间时应当在析构函数中_retCount减到0时释放但是当_retCount减到0时却发现释放的是A空间而B空间发生了内存泄露。也就是静态成员变量_retCount只能记录一块空间的对象个数。 - 下面通过代码介绍方案三 class String { public:String(char* ptr ) //构造函数:_ptr(new char[strlen(ptr)1]), _retCount(new int(1))//每个对象对应一个整型空间存放{ //指向这块空间的对象个数strcpy(_ptr, ptr);}String(const String s) //拷贝构造函数:_ptr(s._ptr), _retCount(s._retCount){_retCount[0];}String operator (const String s) //赋值运算符重载{if (this ! s){if (--_retCount[0] 0){//旧的引用计数减1如果是最后一个引用对象则释放对象delete[] _ptr;delete[] _retCount;}_ptr s._ptr;//改变this的指向并增加引用计数_retCount s._retCount;_retCount[0];}return *this;}~String(){if (--_retCount[0] 0){delete[] _ptr;delete[] _retCount;}} private:char* _ptr;int* _retCount; };123456789101112131415161718192021222324252627282930313233343536373839404142 同样执行Test函数测试结果如下图 下面进一步优化方案三来介绍写时拷贝写时复制 方案三是每个对象对应一个整型空间即_refCount存放指向这块空间的对象个数 再优化不引用_refCount但每次给_ptr开辟空间的时候多开辟四个字节用来记录指向此空间的对象个数规定用开头那四个字节来计数。 class String { public:String(char* ptr ):_ptr(new char[strlen(ptr)5]){_ptr 4;strcpy(_ptr,ptr);_GetRefCount(_ptr) 1;//每构造一个对象头四个字节存放计数}String(const String s):_ptr(s._ptr){_GetRefCount(_ptr); //每增加一个对象引用计数加1}String operator (const String s){if (this ! s){Release(_ptr);_ptr s._ptr;_GetRefCount(_ptr);}return *this;}char operator [](size_t index){if (_GetRefCount(_ptr) 1){--_GetRefCount(_ptr);//旧引用计数减1char* str new char[strlen(_ptr) 1];//另外开辟一个空间str 4;strcpy(str, _ptr);_GetRefCount(str) 1;_ptr str;}}~String(){Release(_ptr);}inline void Release(char* ptr){if (--_GetRefCount(ptr) 0){delete[](ptr - 4);}}inline int _GetRefCount(char* ptr){return *(int*)(ptr - 4);//访问头四个字节} private:char* _ptr; };12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 程序执行过程看下图说话 对下列函数进行解析 char operator [](size_t index){if (_GetRefCount(_ptr) 1){--_GetRefCount(_ptr);//旧引用计数减1char* str new char[strlen(_ptr) 1];//另外开辟一个空间str 4;strcpy(str, _ptr);_GetRefCount(str) 1;_ptr str;}}123456789101112 当在主函数中执行语句s1[0] ‘w’;时想要改变s1对象中_ptr[0]的值但是当我们改变s1中_ptr[0]的值时不希望把s2、s3中_ptr[0]的值也改变了。由于s1、s2、s3目前指向同一块空间改变其中一个另外两个肯定也跟着改变了所以提供了另外一种方法把对象s1分离出来旧引用计数减1另外给s1开辟一段跟原来一样的空间存放一样的内容这时候即使改变了s1的内容也不影响s2、s3的对容。 一样看下图说话
http://www.huolong8.cn/news/204097/

相关文章:

  • 请问做网站怎么赚钱深圳好的高端企业网站建设公司
  • 建设工程质量管理条例网站深圳龙岗属于什么风险
  • 免费招工人在哪个网站济南网站设计
  • 做网站需提供什么资料北京中铁建设集团有限公司
  • 职业生涯规划网站开发背景华为官方手表网站
  • wordpress导航页面模板网络优化app
  • 东营市垦利区胜坨填建设站的网站代码编程入门先学什么
  • 高明网站制作网站站内文章互联
  • 男人和男人做爰漫画网站网站的设计思路怎么写
  • 在线做漫画的网站网站和ip建设
  • 山东 网站建设怎么免费做网站推广
  • 网页制作基础教程电子工业出版社seo外链
  • 高级网站开发工程师 证书优秀htm网站
  • 南桥网站建设摄影师作品网站有哪些
  • 网站前台功能设计图片网站
  • 网站建设图标外贸soho虚拟公司做网站
  • 做图片的网站有哪些四川建设厅网站查询
  • 荣耀手机商城官方网站下载开发简单小程序公司
  • 大学生个人网站模板莆田网站开发
  • 怎样建设网赌网站wordpress的页脚模板修改就出错
  • 为何用wdcp建立网站连不上ftp1688免费货源
  • 设计制作网站的公司163域名注册
  • 高级布局编辑器wordpressseo网络推广企业
  • 建网站的公司时做网站推广哪家公司好
  • share poine 户做网站广州建设网站公司哪个济南兴田德润有活动吗
  • 龙华网站 建设深圳信科wordpress向下兼容
  • 龙华品牌网站制作模板网站的劣势
  • 常州市建设项目审批网站成都网站建设 木木科技
  • 权威的大良网站建设一级a做受片免费网站
  • 集团网站建设的要求长沙 服务