当前位置:首页 > 技术分享 > 正文

C++的这一年

以下为译文:免责声明:本文提出的观点仅代表个人立场,并不代表整个ISOC++标准委员会的意见。1、简介C++20即将发布。开发工具。C++在开发者中的稳定位置。请继续阅读以获得对以上三大方面的全面了解。2、重大事件时间表下表按日期顺序列出了本年度C++发生的重大事件:3、对C++11/14的编译器支...

以下为译文:免责声明:本文提出的观点仅代表个人立场,并不代表整个ISOC++标准委员会的意见。1、简介C++20即将发布。开发工具。C++在开发者中的稳定位置。请继续阅读以获得对以上三大方面的全面了解......


以下为译文:

免责声明:本文提出的观点仅代表个人立场,并不代表整个ISOC++标准委员会的意见。

1、简介

C++20即将发布。

开发工具。

C++在开发者中的稳定位置。

请继续阅读以获得对以上三大方面的全面了解。

2、重大事件时间表

下表按日期顺序列出了本年度C++发生的重大事件:


3、对C++11/14的编译器支持

为了保持完整性,笔者在这里先提醒一下:Clang(从版本3.4开始),GCC(从版本5开始)和IntelC++Compiler(从版本15开始)已经完全支持C++11/14。

VisualStudio团队宣布版完全支持C++17,这也意味着它对C++11/14的支持。现在,你可以构建复杂的代码库,如boost::hana或rangev3。

既然C++11/14在所有主流编译器中都得到了支持,那么就不存在任何理由不使用现代C++了。

4、对C++17的编译器支持

C++17作为ISO/IEC14882标准:2017编程语言–C++发布于2019年12月。

你可以在这里下载一个免费的官方文档的最终版:N4700,2017-10-16,PDF。

支持C++的编译器的一份完整列表可以参考这里:C++17编译器支持。

你也可以阅读我的博客文章:C++17特性()。

关于C++17的语言特性:

从Clang版本5.0、GCC版本8.0、VisualStudio版本15.7和IntelC++Compiler版本19.0.1开始,所有编译器都支持C++17的语言特性。

标准库上还有更多的工作需要完成,特别是针对并行算法和文件系统等重要问题的工作。

对于std::filesystem的支持,你需要GCC版本8.1(或者支持更好的版本9.1)、Clang版本3.9(或者支持更好的版本7.0)和VisualStudio2017版本15.7。

并行算法的更新最早在中提供,但是随着之后的更新,MSVC团队又添加了更多算法。

接下来可以使用的是IntelPSTL实现,它也被添加到GCC版本9.1中。你需要Intel线程构建块(TBB-ThreadingBuildingBlock)作为后端实现(欲知详情,请参考下面这篇文章):

在Linux和macOS上使用和IntelTBB实现C++17STL并行算法(作者:PaulSilisteanu):

而Clang库对并行算法的支持还需要继续等待。

另一个问题是低层转换函数的实现。

VisualStudio从版本15.7开始支持在from_chars()/to_chars()函数中支持整形参数,在版本15.8中又添加了对from_chars()的浮点支持。但是完全一致的支持直到版本16.4(对to_chars()的浮点支持)才开始可用。

到目前为止Clang和GCC版本只支持整数。原因可能是MSVCSTL(标准模板库)的实现是开源的,我们可以预期一些代码将被移植到其他标准库实现中。

5、C++20

关于C++20的讨论今年占据了主导地位。在德国科隆举行的夏季ISOC++标准会议后,C++20的特性已经冻结。在稍晚时间举行的贝尔法斯特C++标准会议上,第一批国家机构的一些意见得到了解决。

总之,这意味着我们明年发布新的C++标准的道路会一马平川!

下面列出C++20的主要特性:

模块(Modules)

协程(Coroutines)

标准库开箱即用的概念(Concepts)

范围(Ranges)

constexpr支持:new/delete,dynamic_cast,try/catch,虚拟

constexpr向量和字符串

计时(Chrono):日历、时区支持

std::format–详见此处C++20中的std::format

std::span

std::jthread

更重要的是,很多C++20的特性在流行的编译器中已经实现了。像模块(Modules)支持这种最重要的工作仍然没有完成(我们只是完成了一些实验性的Module-TS实现)。

像以往一样,完整的编译器支持列表可以在cppreference网站:C++20编译器支持页面()上找到。但是我想在这里列举几个:


6、ISOC++标准会议

今年共计举行了三次C++标准委员会会议,分别在夏威夷的科纳、德国的科隆和北爱尔兰的贝尔法斯特举行。似乎今年的委员会更愿意留在欧洲。

这里可以找到所有的会议计划,包括:即将举行的会议和已经结束的会议()。

下一次会议将于2020年2月在布拉格举行。

二月:夏威夷科纳会议

在这次会议上,下列C++新特性投票后被批准纳入了C++20标准:

模块-P1103!

协程-N4736!

将结构化绑定扩展为更像变量申明-P1091R3

std::polymorphic_allocator-P0339

std::midpoint和std::lerp-P0811

std::execution::unseq执行策略-P1001

std::ssize返回有符号数的自由函数-P1227

查找时预先计算hash值-P0920

并行化TS第二版也被作为以下标准发布:

ISO/IECTS19570:2018编程语言-用于并行化的C++扩展技术规范()。

这次会议的主要会议报告摘要可以从如下两个链接找到:

r/cpp:2019-02科纳ISOC++标准委员会会议报告()和科纳会议后的邮件列表()。

其他版本的会议报告链接如下:

HerbSutter–会议报告:冬季ISOC++标准会议(科纳)

BotondBallo-会议报告:2019年2月科纳C++标准会议

cor3ntin–科纳会议报告

TimurDumler–会议报告:2019年2月夏威夷科纳ISOC++标准委员会会议

七月:德国科隆会议

这次会议是C++20标准的特性冻结会议。这是最后一次投票的机会。

另外,有一个主要的特性在这次会议上从草案中淘汰了。虽然Contracts(合约)很有吸引力,但实际上,委员会未能就最后的实施要点达成一致。因此,最后的决定是最好成立一个独立的研究小组,尝试在C++23中纳入这一特性。

这次会议批准的一些重要特性和变化如下:

合约(Contracts)从C++20中移除,Contracts研究小组成立。

文本格式化支持:std::format("ForC++{}",20)-P0645

C++20同步库-P1135

constexpr内存分配-P0784

constexprstd::vector-P1004

constexprstd::string-P0980

线程可中断join支持(StopToken)-P0660

source_location-P1208

usingenum-P1099

constinit关键字-P1143

数学常量(std::numbers::pi和fris)-P0631

将概念(Concepts)的命名方式从PascalCase(驼峰式命名法)改为snake_case(蛇形命名法)-P1754

废弃volatile关键字-P1152

布局兼容性和指针互易性特征-P0466

构造函数的nodiscard属性-P1771

改进的iteratorconcepthierarchy-P1207

Move-only视图-P1456

附加视图和range适配器-P1035

运算符=加入标准库-P1614

类模板参数推导的扩展-P1021

这次会议的主要议程报告摘要可以在下面两个地方找到:

r/cppthread-colognemeeting()

postColognemailing()

会议报告:

HerbSutter–会议报告:夏季ISOC++标准会议(科隆)

TimurDumler–会议报告:2019年7月德国科隆C++委员会会议,

BotondBallo–会议报告:2019年7月德国科隆C++标准会议

Silexica–会议报告:2019年度德国科隆ISOC++会议

GuyDavidson–德国之行:科隆会议报告

十一月,北爱尔兰贝尔法斯特会议:

这一次,委员会不再投票任何新的特性,他们的大部分时间花在解决国家机构针对C++20草案提出的意见。

主要的会议报告发布在r/cpp网站上,会后的邮件列表地址为:

其他的会议报告有:

HerbSutter-会议报告:秋季ISOC++标准会议(贝尔法斯特)

BotondBallo-会议报告:2019年11月贝尔法斯特C++标准会议

BenCraig会议报告:贝尔法斯特的独立错误

GuyDavidson-在我家后院召开的WG21会议:贝尔法斯特会议报告

7、编译器最新版本及说明

下面列出编译器的最新版本和最引入注目的更新。

VisualStudio

最新版本是VisualStudio2019版本16.4,最后一次更新发生在12月3日。

–版本说明:

今年推出了新版VisualStudio2019!它为已经非常出色的集成开发环境(IDE)带来了许多新的特性和增强功能。

这里是最初发布时的博客文章:

VisualStudio2019:|VisualStudioBlog()。

一些重要的特性:

基于VisualStudioIntelliCode的人工智能辅助代码补全。

在C++MSBuild和CMake项目中对Clang和MSVC的Clang-Tidy的支持。

AddressSanitizer支持Windows上使用MSVC编译的项目

和CMake更好的集成。

概念(Concepts)在版本16.3中可用

对to_chars()的全面支持,完善了C++17中的要求。

提供了一个名为C++BuildInsights的新工具集。欲知详情,请参阅C++团队博客。

另一个主要的更新来自Cppcon大会,MSVC团队在会上宣布将他们的标准模板库实现开源!详情请参见:

MSVC宣布开源其标准模板库实现|C++团队博客()

一些其他新闻:

AddressSanitizer(ASan)在Windows上支持MSVC|C++团队博客

在VisualStudio中使用clang-tidy进行代码分析|C++团队博客

VisualStudio2019版本16.3开始支持C+20Concepts特性|C++团队博客

这里有一个关于C++标准(包括C++20)的一致性的文档:

MicrosoftC++语言一致性清单()。

GCC

最新的稳定版本9.2,发布于8月12日,详情请参见:GCC9发布系列更新()。

GCC对当前C++特性的支持()

Libstdc++状态()

Clang

最新的稳定版本9.0,发布于2019年9月19日。详情请参见:版本发布说明

Clang对当前C++特性的支持()

libc++C++1z状态()

IntelCompiler

最新版本19.1,发布于2019年4月2日。详情请参见:版本发布说明()

Intel®C++Compiler对C++14特性的支持()

Intel®C++Compiler对C++17特性的支持()

C++Builder

最新版本为更新3,于2019年11月21日发布,详见版本发布说明。

集成开发环境(IDE)-EmbarcaderoC++Builder使用了一个经过修改的Clang编译器(版本5.5)和一个Dinkumware标准模板库(STL)实现,它可以与Win32和Win64应用程序一起工作。这是一个功能全面的IDE,用于从单一C++代码库构建iOS、安卓、Windows和macOS应用程序。

一些相关新闻:

版本10.3.2新增功能:用于64位Windows环境的C++17--实现在所有Windows环境下使用C++17Clang编译器。

新的Delphi和C++BuilderRAD服务器课程,已在Embarcadero学院、Embarcadero博客站点、开发者工具和IDERA社区提供

新增功能:C++17的异步代码补全,以及其他功能

这里是一份C++特性的一致性清单:编译器对现代C++语言特性的支持()

8、各种工具

当编译器帮助C++代码完成了主要任务时,我们也不能忘记其他工具的重要性。

以下是一些重要的工具,值得了解一下:

Clang工具:

Clang/LLVM提供了许多强大的实用程序,例如:

ClangTidy

Clang-Include-Fixer

AddressSanitizer

MemorySanitizer

对于VisualStudio,你可以使用ClangPowerTools,它是VisualStudio的一个扩展.

它由VictorCiura开发(@ciura_victor)。

最新版本5.5于2019年12月18日发布.详见版本变更日志。

它同时还有一个付费版本。

集成开发环境

VisualAssist–最新版本发布于2019年11月11日。详见:

TomatoSoup博客文章|VisualAssist版本2353已经可用()。

ReSharperC++-最新版本为2019.3,详见:

ReSharperC++博客文章|ReSharperC++版本2019.3:支持C++20概念,类型提示,编写的,用于在程序源代码中进行错误检测的工具。在Windows和Linux环境下都能够工作。

最新版本是PVS-Studio版本7.05,请参阅今年的所有发布说明()。

今年的一些显著改进包括:.NETCore3和3.1项目分析、MISRA编码准则支持、40多项新检查、对Java和SonarQube插件的支持。

包管理器:

Conan–版本1.21已经可用。

Microsoft/vcpkg:VC++打包工具–一个适用于Windows、Linux和MacOS环境的开源C++库管理器。

9、C++相关会议

我们没有理由抱怨C++会议的缺乏。实际上今年有很多会议机会,尤其是在春季和秋季,下面是几个会议的例子:

CppCon–2019年9月举行

C++Now–2019年5月举行

MeetingC++-2019年11月举行

ACCU–春季会议在2019年4月举行,秋季会议在11月举行

还有很多其他的会议,如:Code::Dive、C++意大利大会、C++onSea、C++意大利日、C++俄罗斯大会、核心C++2019大会、等等。

以防万一,这里是ISOC++网站上的全球注册会议的链接:C++全球会议和FAQ()。

10、社区和用户组

用户组提供给你遇见其他C++程序员,分享你的经验和学习新事物的机会。我强烈建议你定期访问这些用户组,或者至少偶尔访问一次。

我很高兴,我所在的城市(Cracow)的用户组C++Krakow用户组():今年将继续存在,如果你住在附近的话可以加入!

如果你在查看完这个全球用户组列表后确认你附近没有C++用户组。你还可以加入如下用户组:

C++Slack频道:

,当然也低于Javascript,而它在上一年排名第10。详见:2019StackOverflow开发者调查()

在GitHub调查中,C++排名从去年的第5下降到今年的第6。详见:2019Octoverse统计报告()

我个人觉得,C++仍然很强大。也许它并不完美,也不容易学习,但是很多代码仍然是用这种语言构建的。Rust或其他系统语言不会很快取代它。它的工具越来越好,而这个语言正在致力于降低它的复杂性,所以初学者的体验希望是越来越好。

然而,C++只是工具的一种,我们很感激今天我们有很多工具可以使用。

我还找到了DanielLemire最近发表的一篇文章,十年前他对程序开发和编程语言做了一些预测。他对C++的增长感到惊讶。

让我们看看DanielLemire的评价:

我认为从2010开始,C++已经成为一种更好的语言。这并不容易,但已经超出了我的预期。

13、问卷调查

一个多星期前,我做了一个快速的问卷调查,希望得到一些关于C++使用的数据。我收到了574个回复!感谢大家!

C++标准的使用

在日常工作中,你使用哪个C++标准?



(注:以上百分比的总和不是100%)。

在这份调查中,我没有明确“使用”的准确含义,所以它既可以指生产环境的编码,也可以指业余项目的编码。比如,我看到C++20的使用率很高,但我相信它主要用于测试,还没有用于完整的生产环境,或者,也许我错了?

C++17的使用经验

你对C++17的使用有什么经验?


我们可以看到,今年C++17标准的采用率在稳步增长。

C++20的使用经验

你对C++20的使用有什么经验?


编译器的使用

你使用什么编译器?


(注:以上百分比的总和不是100%)。

你还用哪些其他的开发工具?


去年我没有问这个问题。

我认为这个问题中的“debuggers”不是个好选项,因为我们可以假设所有的开发人员在某个时候都会使用它。

当然还有一些“其他”的答案,包括:ccache、meson、make、Boostbuild、QMake、Autotools、cmakeformat、Emacs、WholeTomato。

你认为2019年发生的最好的事情是什么?

这是一个开放性的问题,根据我收集到的回答,主要有以下几件大事(以下列表基于答案中出现的顺序,没有特殊的排序):

CppCon2019大会

C++20新特性和标准化

C++20中的模块(Modules)特性

协程(Coroutines)

概念(Concepts)

范围(Ranges)

std::format

Code::Dive2019大会

MeetingC++2019大会

C++博客-帮助更容易学习和掌握最新的语言

C++书籍和课程–提升水平,更多的选择机会

C++Cast

C++社区–大会,用户组

越来越好用的工具:Clangbuildanalyser,VS2019,QTCreator,CLion

我也很高兴看到有人说“最好的是我的书”。谢谢:)

给个对这个问题的回答例子:

“最好的事情是了解了C++17的细节”,当然,这个免费版本坚定了我在项目中使用它的想法。

其他问卷调查

C++标准委员会在今年的二月份也发出了一份问卷调查。他们设法获得了2000多份回复。

这份问卷调查表和结果可以在这里找到:第二次C++基金会年度开发者问卷调查:标准C++()

调查结果.

还有一项来自Jetbrains的调查:C++2019-2019信息图表中开发者生态系统状态调查()

14、总结

本年度我想强调的就以下三件事情:

C++20即将发布。

开发工具–让编写C++代码更加容易!

C++在开发者中的稳定位置

总而言之,我认为在未来的十年,我们可以以一种积极乐观的态度看待C++。虽然我们无法预知更远的将来会发生什么,但是至少在接下来的十年里,我相信C++应该是稳定的。有了所有这些工具的帮助,新的C++标准编写的C++代码会更加容易访问,并且更加不容易出错。在可预见的将来,C++仍然是追求性能的应用程序的无二选择,甚至它会取代C和Fortran。

私信“资料”获取更多~

最新文章