开发者社区> 异步社区> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《C++编程规范:101条规则、准则与最佳实践》——2.6尽量减少全局和共享数据

简介:
+关注继续查看

本节书摘来自异步社区出版社《C++编程规范:101条规则、准则与最佳实践》一书中的第2章,第2.6节,作者:【加】Herb Sutter , 【罗】Andrei,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.6尽量减少全局和共享数据

摘要
共享会导致冲突:避免共享数据,尤其是全局数据。共享数据会增加耦合度,从而降低可维护性,通常还会降低性能。

讨论
这里的论述比第18条的具体讨论更加通用。

避免使用名字空间作用域中具有外部连接的数据或者作为静态类成员的数据。这些数据会使程序逻辑变得更加复杂,使程序不同的(而且可能更糟,距离较远的)部分耦合得更加紧密。共享数据对单元测试会产生不良影响,因为使用共享数据的代码片断的正确性不仅取决于数据变化的过程,更取决于以后会使用该数据的未知代码区域的机能。

全局名字空间中的对象名称还会污染全局名字空间。

如果必须使用全局的、名字空间作用域的或者静态的类对象,一定要仔细地对其进行初始化。在不同编译单位中这种对象的初始化顺序是未定义的,正确处理它们需要特殊的技术(参阅本条的参考文献)。初始化顺序规则是非常难于掌握的,应该尽量避免使用;如果不得不用,应该充分了解,谨慎使用。

名字空间作用域中的对象、静态成员对象或者跨线程或跨进程共享的对象会减少多线程和多处理器环境中的并行性,往往是产生性能和可伸缩性瓶颈的原因(见第7条)。为“无共享”而奋斗吧,用通信方式(比如消息队列)代替数据共享。

应该尽量降低类之间的耦合,尽量减少交互(参阅[Cargill92])。

例外情况
程序范围的设施cin、cout和cerr比较特殊,其实现方式很特别。工厂类必须维护一个注册表,记录创建给定类型时要调用哪个函数,而且通常应该有一个用于整个程序的注册表(但最好是属于工厂类,而不是属于共享全局对象,见第11条)。

跨线程共享对象的代码应该总是将对这些共享对象的所有访问序列化(见第12条并参阅[Sutter04c])。

参考文献
[Cargill92] pp.126.136,169-173 ● [Dewhurst03] §3 ● [Lakos96] §2.3.1 ● [McConnell93] §5.1-4 ● [Stroustrup00] §C.10.1 ● [Sutter00] §47 ● [Sutter02] §16, Appendix A ● [Sutter04c] ● [SuttHysl03]

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
(JAVA编程练习):判断101-200之间有多少个素数,并输出所有素数。
(JAVA编程练习):判断101-200之间有多少个素数,并输出所有素数。
188 0
【C/C++学院】(26)Oracle数据库编程--程序模板c/cpp
<p>Makefile</p> <p></p> <pre code_snippet_id="627108" snippet_file_name="blog_20150324_1_7506775" name="code" class="cpp">.SUFFIXES: .c .o CC=gcc PROC=proc PROCSRCS=oracle.pc DBSRCS=$(PROCSRCS:
1261 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载