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

长春建网站公司如何做小程序推广

长春建网站公司,如何做小程序推广,如何做一个论坛网站,佛山教育平台网站建设在实际的使用过程中#xff0c;很多人都会有这样的问题#xff1a; 不知道智能指针的具体使用场景无脑只使用 shared_ptr认为应该禁用 raw pointer(裸指针#xff0c;即 Widget * 这种形式)#xff0c;全部使用智能指针 本文将从这几方面讲解智能指针#xff1a; 智能指…在实际的使用过程中很多人都会有这样的问题 不知道智能指针的具体使用场景无脑只使用 shared_ptr认为应该禁用 raw pointer(裸指针即 Widget * 这种形式)全部使用智能指针 本文将从这几方面讲解智能指针 智能指针的应用场景分析智能指针的性能分析: 为什么 shared_ptr 性能比 unique_ptr 差指针作为函数参数时应该传传值、传引用还是裸指针 对于智能指针的使用实际上是对所有权和生命周期的思考一旦想明白了这两点那对智能指针的使用也就得心应手了。 1.unique_ptr专属所有权 1.1 介绍 我们大多数场景下用到的应该都是 unique_ptr。 unique_ptr 代表的是专属所有权即由 unique_ptr 管理的内存只能被一个对象持有。 所以unique_ptr 不支持复制和赋值如下 auto w std::make_uniqueWidget(); auto w2 w; // 编译错误 如果想要把 w 复制给 w2, 是不可以的。因为复制从语义上来说两个对象将共享同一块内存。 因此unique_ptr 只支持移动, 即如下 auto w std::make_uniqueWidget(); auto w2 std::move(w); // w2 获得内存所有权w 此时等于 nullptr unique_ptr 代表的是专属所有权如果想要把一个 unique_ptr 的内存交给另外一个 unique_ptr 对象管理。只能使用 std::move 转移当前对象的所有权。转移之后当前对象不再持有此内存新的对象将获得专属所有权。 如上代码中将 w 对象的所有权转移给 w2 后w 此时等于 nullptr而 w2 获得了专属所有权。 1.2 性能 因为 C 的 zero cost abstraction 的特点unique_ptr 在默认情况下和裸指针的大小是一样的。 所以 内存上没有任何的额外消耗性能是最优的 1.3 使用场景 1忘记 delete unique_ptr 一个最简单的使用场景是用于类属性。代码如下 class Box{ public:Box() : w(new Widget()){}~Box(){// 忘记 delete w} private:Widget* w; }; 如果因为一些原因w 必须建立在堆上。如果用裸指针管理 w那么需要在析构函数中 delete w; 这种写法虽然没什么问题但是容易漏写 delete 语句造成内存泄漏。 如果按照 unique_ptr 的写法不用在析构函数手动 delete 属性当对象析构时属性 w 将会自动释放内存。 2异常安全 假如我们在一段代码中需要创建一个对象处理一些事情后返回返回之前将对象销毁如下所示 void process() {Widget* w new Widget();w-do_something(); // 可能会发生异常delete w; } 在正常流程下我们会在函数末尾 delete 创建的对象 w正常调用析构函数释放内存。 但是如果 w-do_something() 发生了异常那么 delete w 将不会被执行。此时就会发生 内存泄漏。 我们当然可以使用 try…catch 捕捉异常在 catch 里面执行 delete但是这样代码上并不美观也容易漏写。 如果我们用 std::unique_ptr那么这个问题就迎刃而解了。无论代码怎么抛异常在 unique_ptr 离开函数作用域的时候内存就将会自动释放。 2. shared_ptr共享所有权 2.1 介绍 在使用 shared_ptr 之前应该考虑是否真的需要使用 shared_ptr, 而非 unique_ptr。 shared_ptr 代表的是共享所有权即多个 shared_ptr 可以共享同一块内存。 因此从语义上来看shared_ptr 是支持复制的。如下 auto w std::make_sharedWidget(); {auto w2 w;cout w.use_count() endl; // 2 } cout w.use_count() endl; // 1 shared_ptr 内部是利用引用计数来实现内存的自动管理每当复制一个 shared_ptr引用计数会 1。当一个 shared_ptr 离开作用域时引用计数会 - 1。当引用计数为 0 的时候则 delete 内存。 同时shared_ptr 也支持移动。从语义上来看移动指的是所有权的传递。如下 auto w std::make_sharedWidget(); auto w2 std::move(w); // 此时 w 等于 nullptrw2.use_count() 等于 1 我们将 w 对象 move 给 w2意味着 w 放弃了对内存的所有权和管理此时 w 对象等于 nullptr。 而 w2 获得了对象所有权但因为此时 w 已不再持有对象因此 w2 的引用计数为 1。 2.2 性能 内存占用高 shared_ptr 的内存占用是裸指针的两倍。因为除了要管理一个裸指针外还要维护一个引用计数。 因此相比于 unique_ptr, shared_ptr 的内存占用更高 原子操作性能低 考虑到线程安全问题引用计数的增减必须是原子操作。而原子操作一般情况下都比非原子操作慢。 使用移动优化性能 shared_ptr 在性能上固然是低于 unique_ptr。而通常情况我们也可以尽量避免 shared_ptr 复制。 如果一个 shared_ptr 需要将所有权共享给另外一个新的 shared_ptr而我们确定在之后的代码中都不再使用这个 shared_ptr那么这是一个非常鲜明的移动语义。 对于此种场景我们尽量使用 std::move将 shared_ptr 转移给新的对象。因为移动不用增加引用计数性能比复制更好。 2.3 使用场景 shared_ptr 通常使用在共享权不明的场景。有可能多个对象同时管理同一个内存时。对象的延迟销毁。陈硕在《Linux 多线程服务器端编程》中提到当一个对象的析构非常耗时甚至影响到了关键线程的速度。可以使用 BlockingQueuestd::shared_ptrvoid 将对象转移到另外一个线程中释放从而解放关键线程。 3. 选择哪种指针作为函数的参数 很多时候函数的参数是个指针。这个时候就会面临选择困难症这个参数应该怎么传应该是 shared_ptr还是 const shared_ptr还是直接 raw pointer 更合适。 只在函数使用指针但并不保存对象内容 假如我们只需要在函数中用这个对象处理一些事情但不打算涉及其生命周期的管理也不打算通过函数传参延长 shared_ptr 的生命周期。 对于这种情况可以使用 raw pointer 或者 const shared_ptr。 即 void func(Widget*); void func(const shared_ptrWidget) 实际上第一种裸指针的方式可能更好从语义上更加清楚函数也不用关心智能指针的类型。 在函数中保存智能指针 假如我们需要在函数中把这个智能指针保存起来这个时候建议直接传值。 void func(std::shared_ptrWidget ptr); 这样的话外部传过来值的时候可以选择 move 或者赋值。函数内部直接把这个对象通过 move 的方式保存起来。 这样性能更好而且外部调用也有多种选择。 参考 C 智能指针的正确使用方式 | 编程沉思录
http://www.pierceye.com/news/69591/

相关文章:

  • 服务类网站建设网络维护工作
  • 网站设置为默认主页全中文软件开发工具
  • gif网站素材互联网怎么学
  • 公司网站内容相近网站怎么做防御
  • 浦项建设公司员工网站茂名做网站公司
  • 茂名营销型网站建设东莞网站网络公司
  • 网站网页设计公司有哪些网站建设与维护税率
  • 乌市地区建设工程门户网站软环境建设办公室网站
  • 能打开网站的浏览器网站开发建模工具
  • 广东外贸网站建设wordpress页面定制器
  • 淘宝做网站中国机械采购网
  • 成都h5建站hao123网址下载到桌面
  • 查看网站开发做网站还要维护吗
  • 建立一个个人网站少女免费观看片tv
  • 英文网站推广公司宁波建网站一站式服务
  • app电商网站尚仁网站建设
  • 做网站要买什么类型云空间专业的专业的网页制作公司
  • 免费设计网站素材网站开发及app开发公司
  • 7天精通网站建设实录简介242企业邮箱服务
  • 北京燕华工程建设有限公司网站网站建设中 即将上线html5源代码
  • 什么网站做产品销售做的好网站建设较好的公司
  • wordpress用什么主题电商网站商品页的优化目标是什么?
  • 北京的网站建设收费标准展会展厅设计制作公司
  • 个人网站名字黄页
  • 郑州 科技有限公司 网站建设泰安网络营销推广
  • wordpress 云标签小工具天津seo实战培训
  • wordpress设置爬虫页面江门网站优化排名
  • 网站地图类型汽车logo设计图片创意
  • 中山市有什么网站推广如何做期货培训网站
  • 温州建设工程信息网站西安网站建设聂卫