当前位置:首页 > 芯闻号 > 充电吧
[导读]智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点:性能问题。因为需要引入一些变量(bookkeeping),甚至

智能指针使用上的问题

智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点:

性能问题。因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高。比如以智能指针作为函数参数以及返回值时。对象释放的时机不明确。比如std::auto_ptr,总让人感觉不明不白。而有时一些循环引用,又会导致内存泄露。

所以即便有了智能指针,程序员还是要认真考虑使用它们的时机。

智能指针的本质是所有权管理

所有权(Ownership)是一个用来管理动态分配内存的记录(bookkeeping)技术。动态分配内存的所有者需要负责在所分配内存不再需要时释放它。共享所有权时,最后一个owner负责清理。即使不是共享,也可以在代码间传递Ownership。

运用智能指针的核心是保持所有权(Ownership)的明确、清晰。一般情况下是保证所有权的单一,无论是使用WeakPtr, Scoped Pointer都可以保持所有权的单一,这时所有权可以在不同的对象/代码段转移。另一种情况就是需要共享所有权,比较常用的引用指数智能指针,就是帮助完成共享所有权的。

概括起来三个要点:

1.局部化 
推荐保持单一、固定的所有权。当所有权需要在不同代码段间传递时,就要使用智能指针。 
2.明确的清理时机。 
使用引用计数,和std::auto_ptr都会引发对释放时机的疑问。有可能引入一些隐晦的Bug。当需要共享所有权时,一定要先思考这个设计的必要性,以及内存释放的时机是否明确、清晰。 
3.最好的方式不要使用指针。可以使用引用来代替指针。见后面WebKit的故事。

大型项目中的应用Google Coding Style的约定

如果需要动态分配内存,尽量由分配的代码来持有所有权。 
如果另一段代码需要访问对象,先考虑传递对象拷贝,指针或者引用,而不是传递所有权。如果确有需要时,建议使用std::unique_ptr来显示的传递所有权(使用std::move())。 
除非有好的理由,否则不要共享所有权。比如为了避免复制。这时需要确定有明显的性能收益,而且所持有的对象最好是只读的, 同时建议使用std::shared_ptr:

std::shared_ptr;

1

新代码里不要再使用scoped_ptr,更不要使用std::auto_ptr, 而是使用std::unique_ptr来代替。

WebKit的故事

WebKit文档记录了他们使用引用计数指针的故事,详情见:RefPtr Basics。大意为: 
早在2005年时为了解决内存泄露问题,开始使用基于引用计数的智能指针,但是它有性能问题,特别是当作函数参数和返回值传递时。后来使用C++11提供move语义(即转移所有权的方式)来解决了这个问题。(另外shared_ptr const & 的形式也可以避免不必要的引用计数操作。)

而到了2013年,WebKit的开发者发现泛滥的判空和有效性检查,于是开始倾向于尽可能地使用引用(注意:不是引用计数指针), 而不是指针。

小结

解决内存问题的最佳的途径仍然是由程序员管理好对象的生命周期。使用智能指针也是有成本的,同时也会引入一些新问题,所以需要遵循一些约定来使用。Google Chromium/Webkit都有相应用的定义:

Chromium: Smart Pointer GuidelineWebKit: RefPtr Basics

另外明确约定一个函数是否会返回空指针,特别是对于API来说,也会帮助使用者避免一些不必要的判空处理和一些隐晦的Bug。

进一步学习:

unique_ptr使用简介Reference counting smart pointers are for retards.

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

5 月 28 日(路透社)—— Nvidia (NVDA.O)周二,该公司股价上涨约 6%,创下历史新高,这家人工智能芯片制造商的股票市值距离超越苹果(AAPL.O)仅差约 1000 亿美元,是华尔街最大企业集团的一次重...

关键字: 英伟达 苹果

近日,马斯克谈到了旗下AI初创公司xAI的聊天机器人Grok,声称要将其打造成“又严谨、又追求真理、又是最风趣”的AI聊天机器人,不过他承认,Grok在与OpenAI和Google竞争之前,还需要迎头赶上,马斯克也补充说...

关键字: 马斯克 Grok ChatGPT AI xAI

业内消息,近日超过2000名来自三星电子的工会成员于在韩国首都首尔聚集,举行了一场罕见的集会,要求韩国科技巨头三星电子给予公平加薪。此前三星电子决定今年加薪5.1%,但工会还希望增加1天的年假以及透明的基于绩效的奖金。

关键字: 三星电子

5月26日,华为ICT大赛2023-2024全球总决赛闭幕式暨颁奖典礼在深圳举行。本届大赛为华为历届最大规模的线下比赛,共吸引了全球80多个国家和地区、2000多所院校、17万余名学生报名参赛,经过国家赛、区域赛层层选拔...

关键字: ICT 华为 大赛 人工智能

近日,整数智能与浪潮信息签署元脑生态战略合作协议。双方将秉持协同共生、开放共赢的原则,在元脑生态的框架内开展AI与数据科学领域的深度协作,共同为各行业提供更安全高效的数据管理平台,用智能标注助力数据生产的低成本、高精度、...

关键字: 自动化 人工智能 元脑生态

2024年5月25日,上海市欧美同学会长宁分会与曼彻斯特大学中国中心以"智能向善 AI for good"为主题,联合举办了"第二届人工智能论坛"。人工智能领域的企业家和专家学者发表主题演讲及参与圆桌论坛,逾百余位海归学...

关键字: 人工智能 AI 大语言模型

近日,第一届"和而泰"杯机器人挑战赛暨企业交流日活动在华南理工大学广州国际校区圆满落幕。本次活动由华南理工大学吴贤铭智能工程学院、铭诚书院、超级机器人研究院(黄埔)主办。此次挑战赛旨在提升参赛选手的专业技能,推动跨学科竞...

关键字: 机器人 机器人系统 信息安全 工业机器人

信达生物制药集团(香港联交所股票代码:01801),一家致力于研发、生产和销售肿瘤、自身免疫、代谢及心血管、眼科等重大疾病领域创新药物的生物制药公司,今日宣布其自主研发的重组抗白介素23p19亚基(IL-23p19)抗体...

关键字: SI PGA 信号 IO

进入人工智能时代,数据重要性进一步凸显。今年,国家数据局等17部门联合印发的《"数据要素x"三年行动计划》指出,要以数据驱动发现新规律、创造新知识,加速科学研究范式变革。北京材料基因工程高精尖创新中心在浪潮信息助力下,通...

关键字: 新材料 数据中心 人工智能

在全球 170 个 Digital Realty 数据中心推出解決方案

关键字: 晶片 数据中心
关闭
关闭