青岛网站建设方案案例下列什么不是用于制作网页的软件
2026/5/13 19:45:08 网站建设 项目流程
青岛网站建设方案案例,下列什么不是用于制作网页的软件,wordpress查看用户,男男做暧暧视频网站1. 核心概念对比 特性std::unique_ptrstd::shared_ptrstd::weak_ptr所有权独占所有权共享所有权无所有权#xff08;弱引用#xff09;拷贝语义不可拷贝#xff0c;只能移动可拷贝#xff0c;引用计数增加可拷贝#xff0c;不增加引用计数资源释放时机所有者销毁时最后一…1. 核心概念对比特性std::unique_ptrstd::shared_ptrstd::weak_ptr所有权独占所有权共享所有权无所有权弱引用拷贝语义不可拷贝只能移动可拷贝引用计数增加可拷贝不增加引用计数资源释放时机所有者销毁时最后一个shared_ptr销毁时不负责释放资源性能开销几乎零开销与裸指针相当引用计数开销原子操作引用计数开销内存布局单个指针大小两个指针大小对象指针控制块指针单个指针大小线程安全非线程安全需外部同步引用计数操作线程安全对象访问需同步引用计数操作线程安全2. 详细特性分析2.1std::unique_ptr设计哲学独占所有权零开销抽象// 独占所有权不能共享std::unique_ptrintptr1std::make_uniqueint(42);// std::unique_ptrint ptr2 ptr1; // 错误不能拷贝std::unique_ptrintptr2std::move(ptr1);// 只能移动转移所有权// 自定义删除器编译时确定autodeleter[](int*p){std::coutDeleting int\n;deletep;};std::unique_ptrint,decltype(deleter)ptr3(newint(10),deleter);// 数组版本std::unique_ptrint[]arrstd::make_uniqueint[](10);arr[0]1;// 支持operator[]优点零开销编译器优化后与裸指针相同明确的独占所有权语义编译时多态通过自定义删除器模板参数适合资源管理、RAII模式缺点不能共享所有权不能用于需要共享的场景2.2std::shared_ptr设计哲学共享所有权引用计数#includememory#includeiostreamclassResource{public:Resource(){std::coutResource created\n;}~Resource(){std::coutResource destroyed\n;}};voidusage(){// 创建shared_ptrautosp1std::make_sharedResource();// 引用计数: 1{autosp2sp1;// 拷贝引用计数: 2autosp3sp1;// 拷贝引用计数: 3std::coutsp1.use_count() sp1.use_count()\n;// 3}// sp2, sp3销毁引用计数: 1// 控制块包含引用计数、弱引用计数、删除器、分配器等std::coutsp1.use_count() sp1.use_count()\n;// 1}// sp1销毁引用计数: 0资源被释放// 循环引用问题示例structNode{std::shared_ptrNodenext;~Node(){std::coutNode destroyed\n;}};voidcircularReference(){autonode1std::make_sharedNode();autonode2std::make_sharedNode();node1-nextnode2;// 引用计数: node11, node22node2-nextnode1;// 引用计数: node12, node22 - 循环引用// 函数结束时引用计数都变为1内存泄漏}// 自定义删除器运行时确定voidcustomDeleter(int*p){std::coutCustom delete\n;deletep;}autospstd::shared_ptrint(newint(42),customDeleter);优点允许共享所有权自动管理生命周期线程安全的引用计数支持自定义删除器运行时多态缺点引用计数开销特别是原子操作控制块额外内存开销可能导致循环引用2.3std::weak_ptr设计哲学弱引用避免所有权classObserver;classSubject{std::vectorstd::weak_ptrObserverobservers;public:voidaddObserver(std::weak_ptrObserverobs){observers.push_back(obs);}voidnotify(){for(autoweakObs:observers){if(autoobsweakObs.lock()){// 尝试获取shared_ptr// 如果对象还存在通知它obs-onNotify();}else{// 对象已被释放可以清理弱引用}}}};classObserver{public:voidonNotify(){std::coutNotified!\n;}};// 使用示例voidobserverPattern(){autosubjectstd::make_sharedSubject();autoobserverstd::make_sharedObserver();subject-addObserver(observer);// 传递weak_ptr// observer可以在其他地方被释放不会影响subjectobserver.reset();// 释放observersubject-notify();// 安全不会访问已释放的对象}// 解决循环引用structSafeNode{std::weak_ptrSafeNodenext;// 使用weak_ptr避免循环引用~SafeNode(){std::coutSafeNode destroyed\n;}};voidnoCircularReference(){autonode1std::make_sharedSafeNode();autonode2std::make_sharedSafeNode();node1-nextnode2;// weak_ptr不增加引用计数node2-nextnode1;// 引用计数保持为1// 函数结束时两个节点都能正确释放}优点打破循环引用实现观察者模式缓存实现不影响对象生命周期安全的对象访问通过lock()检查缺点需要额外步骤获取对象lock()不能直接访问对象3. 性能比较#includememory#includechrono#includeiostreamconstintITERATIONS10000000;voidtestUniquePtr(){autostartstd::chrono::high_resolution_clock::now();for(inti0;iITERATIONS;i){autoptrstd::make_uniqueint(i);// 移动操作autoptr2std::move(ptr);}autoendstd::chrono::high_resolution_clock::now();std::chrono::durationdoublediffend-start;std::coutunique_ptr: diff.count()s\n;}voidtestSharedPtr(){autostartstd::chrono::high_resolution_clock::now();for(inti0;iITERATIONS;i){autoptrstd::make_sharedint(i);autoptr2ptr;// 拷贝引用计数操作autoptr3ptr;// 再次拷贝}autoendstd::chrono::high_resolution_clock::now();std::chrono::durationdoublediffend-start;std::coutshared_ptr: diff.count()s\n;}// 典型结果10,000,000次操作// unique_ptr: 0.15s// shared_ptr: 1.20s 约8倍慢内存布局对比structObject{intdata[100];};// unique_ptr: 一个指针8字节std::unique_ptrObjectupstd::make_uniqueObject();// shared_ptr: 两个指针16字节 控制块~32字节std::shared_ptrObjectspstd::make_sharedObject();// make_shared将对象和控制块分配在一起提高局部性// shared_ptrObject sp(new Object()); // 分离分配较差4. 使用场景总结使用std::unique_ptr的场景// 1. 工厂函数返回std::unique_ptrDatabasecreateDatabase(){returnstd::make_uniqueMySQLDatabase();}// 2. 独占资源管理classConnection{std::unique_ptrSocketsocket;// 独占socketstd::unique_ptrBufferbuffer;// 独占buffer};// 3. Pimpl惯用法classMyClass{structImpl;std::unique_ptrImplpimpl;};// 4. 容器中的对象std::vectorstd::unique_ptrShapeshapes;shapes.push_back(std::make_uniqueCircle());使用std::shared_ptr的场景// 1. 共享缓存classCache{staticstd::unordered_mapstd::string,std::shared_ptrResourcecache;staticstd::shared_ptrResourceget(conststd::stringkey){returncache[key];// 共享所有权}};// 2. 共享配置classAppConfig{std::shared_ptrConfigconfig;// 多个组件共享同一配置};// 3. 需要延长对象生命周期的回调classAsyncOperation{std::shared_ptrCallbackcallback;// 确保回调对象在操作完成前存活};// 4. 多线程共享数据classThreadPool{std::shared_ptrTaskQueuequeue;// 多个工作线程共享任务队列};使用std::weak_ptr的场景// 1. 打破循环引用classParent{std::shared_ptrChildchild;};classChild{std::weak_ptrParentparent;// 使用weak_ptr};// 2. 观察者模式classSubject{std::vectorstd::weak_ptrObserverobservers;};// 3. 缓存实现classCache{std::unordered_mapstd::string,std::weak_ptrResourceweakCache;std::shared_ptrResourceget(conststd::stringkey){if(autoitweakCache.find(key);it!weakCache.end()){if(autoresourceit-second.lock()){returnresource;// 对象还存在}weakCache.erase(it);// 对象已释放清理}// 重新加载...}};// 4. 临时对象引用classProcessor{std::weak_ptrTempDatatempData;// 临时数据可能被提前释放};5. 最佳实践总结优先使用std::unique_ptr默认选择除非需要共享所有权性能最佳语义最清晰谨慎使用std::shared_ptr只在真正需要共享所有权时使用注意循环引用问题优先使用std::make_shared合理使用std::weak_ptr解决循环引用实现观察者、缓存等模式总是通过lock()检查有效性选择原则需要独占所有权 →unique_ptr需要共享所有权 →shared_ptr需要弱引用/打破循环 →weak_ptr原始指针/引用 → 用于无所有权场景性能考虑热点路径避免shared_ptr小对象考虑使用unique_ptr或直接存储避免频繁创建/销毁shared_ptr// 混合使用示例classSystem{private:std::unique_ptrDatabasedb;// 独占数据库连接std::shared_ptrConfigconfig;// 共享配置std::weak_ptrMonitormonitor;// 弱引用监控器可能不存在std::vectorstd::unique_ptrTasktasks;// 独占任务对象std::shared_ptrLoggerlogger;// 共享日志器};

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询