建设部四库一平台网站,中国域名注册官网,宣传网页,目前主流搜索引擎是哪种C11 新增的其他功能
C11 增加了很多功能#xff0c;本书无法全面介绍#xff1b;另外#xff0c;本书编写期间#xff0c;其中很多功能还未得到广泛实现。然而#xff0c;有些功能有必要简要地介绍一下。
并行编程
当前#xff0c;为提高计算机性能#xff0c;增加处…C11 新增的其他功能
C11 增加了很多功能本书无法全面介绍另外本书编写期间其中很多功能还未得到广泛实现。然而有些功能有必要简要地介绍一下。
并行编程
当前为提高计算机性能增加处理器数量比提高处理器速度更容易。因此装备了双核、四核处理器甚至多个多核处理器的计算机很常见这让计算机能够同时执行多个线程其中一个处理器可能处理视频下载而另一个处理器处理电子表格。
有些操作能受益于多线程但有些不能。考虑单向链表的搜索程序必须从链表头开始沿链接依次向下搜索直到到达链表末尾在这种情况下多线程的帮助不大。再来看未经排序的数组。考虑到数组的随机存取特征可让一个线程从数组开头开始搜索并让另一个线程从数组中间开始搜索这将让搜索时间减半。
多线程确实带来了很多问题。如果一个线程挂起或两个线程试图同时访问同一项数据结果将如何呢为解决并行性问题C 定义了一个支持线程化执行的内存模型添加了关键字 thread_local提供了相关的库支持。关键字 thread_local 将变量声明为静态存储其持续性与特定线程相关即定义这种变量的线程过期时变量也将过期。
库支持由原子操作atomic operation库和线程支持库组成其中原子操作库提供了头文件 atomic而线程支持库提供了头文件 thread、mutex、condition_variable 和 future。
新增的库
C11 添加了多个专用库。头文件 random 支持的可扩展随机数库提供了大量比 rand() 复杂的随机数工具。例如您可以选择随机数生成器和分布状态分布状态包括均匀分布类似于 rand()、二项分布和正态分布等。
头文件 chrono 提供了处理时间间隔的途径。
头文件 tuple 支持模板 tuple。tuple 对象是广义的 pair 对象。pair 对象可存储两个类型不同的值而 tuple 对象可存储任意多个类型不同的值。
头文件 ratio 支持的编译截短有理数算术库让您能够准确地表示任何有理数其分子和分母可用最宽的整型表示。它还支持对这些有理数进行算术运算。
在新增的库中最有趣的一个是头文件 regex 支持的正则表达式库。正则表达式指定了一种模式可用于与文本字符串的内容匹配。例如方括号表达式与方括号中的任何单个字符匹配因此[cCkK] 与 c、C、k 和 K 都匹配而[cCkK] at 与单词 cat、Cat、kat 和 Kat 都匹配。其他模式包括与一位数字匹配的 \d、与一个单词匹配的 \w、与制表符匹配的 \t 等。在 C 中斜杠具有特殊含义因此对于模式 \d\t\w\d即依次为一位数字、制表符、单词和一位数字必须写成字符字面量“\d\t\w\d”即使用\表示\。这是引入原始字符串的原因之一参见第4章它让您能够将该模式写成 R\d\t\w\d。
ed、grep 和 awk 等 UNIX 工具都使用正则表达式而解释型语言 Perl 扩展了正则表达式的功能。C 正则表达式库让您能够选择多种形式的正则表达式。
低级编程
低级编程中的“低级”指的是抽象程度而不是编程质量。低级意味着接近于计算机硬件和机器语言使用的比特和字节。对嵌入式编程和改善操作的效率而言低级编程很重要。C11 给低级编程人员提供了一些帮助。
变化之一是放松了 PODPlain Old Data的要求。在 C98 中POD 是标量类型单值类型如 int 或 double或没有构造函数、基类、私有数据、虚函数等的老式结构。以前的理念是POD 是可安全地逐字节复制的东西。这种理念没变但 C11 认识到在满足 C98 的某些约束的情况下仍可以是合法的 POD。这有助于低级编程因为有些低级操作如使用C语言函数进行逐字节复制或二进制I/O要求处理对象为 POD。
另一项修改是允许共用体的成员有构造函数和析构函数这让共用体更灵活但保留了其他一些限制如成员不能有虚函数。在需要最大程度地减少占用的内存时通常使用共用体上述新规则在这些情况下给程序员有更大的灵活性和功能。
C11 解决了内存对齐问题。计算机系统可能对数据在内存中的存储方式有一定的限制。例如一个系统可能要求 double 值的内存地址为偶数而另一个系统可能要求其起始位置为 8 的整数倍。要获悉有关类型或对象的对齐要求可使用运算符 alignof() 参见附录E。要控制对齐方式可使用说明符 alignas。
constexpr 机制让编译器能够在编译阶段计算结果为常量的表达式让 const 变量可存储在只读内存中这对嵌入式编程来说很有用在运行阶段初始化的变量存储在随机访问内存中。
杂项
C99 引入了依赖于实现的扩展模型C11继承了这种传统。在使用128位整数的系统中可使用这样的类型。在 C 语言中扩展类型由头文件 stdint.h支持而在 C 中为头文件 cstdint。
C11 提供了一种创建用户自定义字面量的机制字面量运算符literal operator)。使用这种机制可定义二进制字面量如 1001001b。相应的字面量运算符将把它转换为整数值。
C 提供了调试工具 assert。这是一个宏它在运行阶段对断言进行检查如果为 true则显示一条消息否则调用 abort()。断言通常是程序员认为在程序的某个阶段应为 true 的东西。C11 新增了关键字 static_assert可用于在编译阶段对断言进行测试。这样做的目的在于对于在编译阶段而不是运行阶段实例化的模板调试起来将更简单。
C11 加强了对元编程metaprogramming的支持。元编程指的是编写这样的程序它创建或修改其他程序甚至修改自身。在 C 中可使用模板在编译阶段完成这种工作。
语言变化
计算机语言是如何成长和发展的呢C的使用范围足够广后显然需要国际标准并将其控制权交给标准委员会最初是 ANSI 委员会随后是 ISO/ANSI 联合委员会当前是 ISO/IEC JTCI/SC22/WG21(C标准委员会)。ISO 是国际标准组织IEC 是国际电子技术委员会JEC1 是前两家组织组建的联合技术为鸢尾 1 SC22 是 JTC1 下属的编程语言委员会而 WG21 是 SC22 下属的 C 工作小组。
委员会考虑缺陷报告和有关语言修改和扩展的提议并试图达成一致。这个过程既繁琐又漫长《The Dsign and Evolution of C》StroustrupAddison-Wesley1994介绍了这方面的一些情况。寻求一致的委员会沉闷而争议不断可能不是鼓励创新的好方式这也不是标准委员会应扮演的角色。
但就 C 而言还有另外一种变更的途径那就是充满创意的 C 编程社区的直接行动。程序员无法不受羁绊地改进语言但可创建有用的库。设计良好的库可改善语言的用途和功能提高可靠性让编程更容易、更有乐趣。库是在现有语言功能的基础上创建的不需要额外的编译器支持。如果库是通过模板实现的则可以头文件文本文件的方式分发。
一项这样的变革是 STL它主要是 Alexander Stepanov 创建的Hewlett-Packard 免费提供它。STL 在编程社区获得了巨大成功成了第一个 ANSI/ISO 标准的候选内容。事实上其设计影响新标准的其他方面。
Boost 项目
最近Boost 库成了 C 编程的重要部分给 C11 带来了深远影响。Boost 项目发起于 1998 年当时的 C 库工作小组主席 Beman Dawes 召集其他几位小组成员指定了一项计划准备在标准委员会的框架外创建新库。该计划的基本理念是创建一个充当开放论坛的网站让人发布免费的 C 库。这个项目提供有关许可和编程实践的指南并要求对提议的库进行同行审阅。其最终的成果是一系列得到高度赞扬和广泛使用的库。这个项目提供了一个环境让编程社区能够检验和评估编程理念以及提供反馈。
TR1
TR1Technical Report 1是 C 标准委员会的部分成员发起的一个项目它是一个库扩展选集这些扩展与 C98 标准兼容但不是必不可少的。这些扩展是下一个 C 标准的候选内容。TR1 库让 C 社区能够检验其组成部分的价值。当标准委员会将 TR1 的大部分内容融入 C11 时面对的是众所皆知且经过实践检验的库。
在 TR1 中Boost 库占了很大一部分。这包括模板类 tuple 和 array、模板 bind 和 function、智能指针对名称和实现做了一定的修改、static_assert、regex 库 和 random 库。另外Boost 社区和 TR1 用户的经验也导致了实际的语言变更如异常规范的摒弃和可变参数模板的添加其中可变参数模板让 tuple 模板类和 function 模板的实现更好了。
使用 Boost
虽然在 C11 中可访问 Boost 开发的众多库但还有很多其他的 Boost 库。例如Conversion 库中的 lexical_cast 让您能够在数值和字符串类型之间进行简单地转换其语法类似于 dynamic_cast将模板参数指定为目标类型。下面的程序是一个简单示例
// lexcast.cpp -- simple cast from float to string
#includeiostream
#includestring
#includeboost/lexical_cast.hppint main() {using namespace std;cout Enter your weight: ;float weight;cin weight;string gain A 10% increase raises ;string wt boost::lexical_caststring(weight);gain gain wt to ; // string operator()weight 1.1 * weight;gain gain boost::lexical_caststring(weight) .;cout gain endl;return 0;
}下面是两次运行该程序的情况
Enter your weight: 150
A 10% increase raises 150 to 165.Enter your weight: 156
A 10% increase raises 156 to 171.600006.第二次运行的结果凸显了 lexical_cast 的局限性它未能很好地控制浮点数的格式。为控制浮点数的格式需要使用更精致的内核格式化工具这在第17章讨论过。
还可以使用 lexical_cast 将字符串转换为数值。
显然Boost 提供的功能比这里介绍的要多得多。例如Any 库让您能够在 STL 容器中存储一系列不同类型的值和对象方法是将 Any 模板用作各种值的包装器。Math 库在标准 math 库的基础上增加了数学函数。Filesystem 库让您编写的代码可在使用不同文件系统的平台之间移植。有关这个库以及如何将其加入到各种平台的更详细消息请参阅 Boost 网站www.boost.org)。另外有些 C 编译器如 Cygwin 编译器还自带了 Boost 库。
接下来的任务
如果仔细阅读了本书则应很好地掌握了 C 的规则。然而这仅仅是学习这种语言的开始接下来需要学习如何高效地使用该语言这样的路更长。最好的情况是工作或学习环境让您能够接触优秀地 C 代码和程序员。另外了解 C 后便可以阅读一些介绍高级主题和面向对象编程的书籍附录 H 列出了一些这样的资源。
OOP 有助于开发大型项目并提高其可靠性。OOP 方法的基本活动之一是发明能够表示正在模拟的情形被称为问题域problem domain的类。由于实际问题通常很复杂因此找到适当的类富有挑战性。创建复杂的系统时从空白开始通常不可行最好采用逐步迭代的方式。为此该领域的实践者开发了多种技术和策略。具体地说重要的是在分析和设计阶段完成尽可能多的迭代工作而不要不断地修改实际代码。
常用的技术有两种用例分析use-case analysis和 CRC 卡CRC card。在用例分析中开发小组列出了常见的使用方式或最终系统将用于的场景找出元素、操作和职责以确定可能要使用的类和类特性。CRCClass/Responsibilities/Collaborators 的简称卡片是一种分析场景的简单方法。开发小组为每个类创建索引卡片卡片上列出了类名、类责任如表示的数据和执行的操作以及类的协作者如必须与之交互的其他类。然后小组使用 CRC 卡片提供的接口模拟场景。这可能提出新的类、转换责任等。
在更大的规模上是用于整个项目的系统方法。在这方面最新的工具是统一建模语言Unified Modeling LanguageUML它不是一种编程语言而是一种用于表示编程项目的分析和设计语言是由 Grady Booch、Jim Rumbaugh 和 Ivar Jacobson 开发的他们分别是更早的 3 种建模语言Booch Method、OMT对象建模技术Object Modeling Technique和 OOSE面向对象的软件工程Object-Oriented Software Engineering的主要开发人员。UML 是从这3种语言演化而来的于2005年被 ISO/IEC 批准为标准。
除加深对 C 的总体理解外还可能需要学习特定的类库。例如Microsoft 和 Embracadero 提供了大量简化 Windows 编程的类库而 Apple Xcode 提供了简化 Apple 平台如 iPhone编程的类库。
总结
C新标准新增了大量功能。有些旨在让 C 更容易学习和使用这包括用大括号括起的统一的列表初始化、使用 auto 自动推断类型、类内成员初始化以及基于范围的 for 循环而有些旨在增强类设计以及使其更容易理解这包括默认的和禁用的方法、委托构造函数、继承构造函数以及让虚函数设计更清晰的说明符 override 和 final。
有几项改进旨在提供程序和编程效率。lambda 表达式比函数指针和函数符更好模板 function 可用于减少模板实例数量右值引用让您能够使用移动语义以及实现移动构造函数和移动赋值运算符。
其他改进提供了更佳的工作方式。作用域内枚举让您能够更好地控制枚举的作用域和底层类型模板 unique_ptr 和 shared_ptr 让您能够更好地处理使用 new 分配的内存。
新增的 decltype、返回类型后置、模板别名和可变参数模板让模板设计得到了改进。
修改后的共用体 和 POD 规则、alignof() 运算符、alignas 说明符以及 constexpr 机制支持低级编程。
新增了多个库包括新的 STL 类、tuple 模板 和 regex 库为众多常见的编程问题提供了解决方案。
为支持并行编程新标准还添加了关键字 thread_local 和 atomic 库。
总之无论对新手还是专家来说新标准都改善了 C 的可用性和可靠性。