31

最近我开始阅读(只是一点点)未来 C++11 标准的当前草案

有很多新功能,其中一些已经通过 Boost Libs 提供。当然,我对这个新标准非常满意,我想尽快使用所有新功能。

无论如何,与一些朋友、长期 C++ 开发人员谈论这个草案时,出现了一些担忧。所以,我问你(回答他们):

1) 语言本身

这个更新是巨大的,对于单个标准更新来说可能太大了。对于编译器供应商(即使他们中的大多数已经开始实现某些功能)以及最终用户来说都是巨大的。

特别是,我的一个朋友告诉我“这是一种新语言”。

  • 我们可以在这次更新之后将它视为一种全新的语言吗?
  • 您打算切换到新标准还是跟上“旧”标准?

2) 语言知识

  • 新标准将如何影响学习曲线?
  • 教语言会更难吗?
  • 有些功能虽然非常棒,但对我来说似乎有点“学术”(我的意思是定义)。我错了吗?
  • 掌握所有这些新增功能可能是一场噩梦,不是吗?
4

11 回答 11

18

简而言之,不,我们不能认为这是一种新语言。这是相同的语言,新功能。但是,如果您使用支持 0x 标准的编译器,它们现在将成为标准包含,而不是通过使用 Boost 库来固定。

使用支持新标准的编译器时,不必使用新标准。但是,如果正在开发的软件存在某些限制,则必须学习和使用新标准,但这是任何软件努力的限制。我认为 0x 标准带来的新功能将使某些事情变得更容易,更不容易出错,因此了解新功能是什么以及它们将如何改进未来工作的设计策略对一个人来说是有利的。人们还必须学习它,以便在使用它开发的软件时,他们会了解正在发生的事情,而不是大吵大闹。

至于我是否会“切换到新标准”,如果这意味着我将学习新标准并在适用的地方使用它并提高我的生产力,那么是的,我当然打算切换。但是,如果这意味着我将仅限于使用 0x 标准的新功能,那么不,因为我的大部分工作都涉及在标准之前编写的代码,重新设计所有内容以使用新功能将是一项艰巨的任务特征。不仅如此,它还可能引入新的错误和性能问题,我没有经验就不会意识到这些问题。

学习 C++ 一直是程序员可以承担的更具挑战性的旅程之一。向语言添加新特性不会改变学习其语法以及如何有效使用它的难度,但方法会改变。人们仍将了解指针及其工作方式,但他们还将了解智能指针及其管理方式。在某些情况下,人们会以与以前不同的方式学习事物。例如,人们仍然需要学习如何初始化事物,但现在他们将学习统一初始化和初始化列表作为做事的主要方式。在某些情况下,通过为范围添加新的 for 语法或在函数声明中添加自动返回类型,可能会更容易理解事物。我认为总的来说,

掌握一门语言是一个长期的目标,不可能一蹴而就。认为一个人可以快速掌握像 C++ 这样复杂的东西是愚蠢的。需要实践、经验和调试代码才能真正做到。学术学习是一回事,但运用这些知识是完全不同的怪物。我认为如果一个人已经掌握了C++语言,新的概念不会造成太大的负担,但是一个新来的人可能有一个优势,他们不会费心去学习一些更过时的做事方式.

于 2009-05-07T15:16:21.093 回答
15

1) 语言本身

据我所知,C++'03 和 C++'0x 之间确实没有重大变化。我在这里能想到的唯一一个与 auto用作存储类说明符有关,但由于它没有语义意义,我不认为这是一个问题。

该标准还有许多其他学术修复非常必要,例如对成员数据布局的更好描述。最后,随着多核/cpu 架构成为常态,修复内存模型是必须的。

2) 语言知识

就个人而言,我认为对于 99.9% 的 C++ 开发人员来说,新的语言会更容易使用。我特别考虑诸如 auto、lambda 和 constexpr 之类的功能。这些功能确实应该使使用该语言更加愉快。

在更高级的级别上,您还有其他功能,例如可变参数模板等,可以帮助更高级的用户。

但是这里并没有什么新鲜事,我仍然对没有使用(甚至听说过)STL 的日常 C++ 开发人员的数量感到惊讶。

从个人的角度来看,我在新标准中唯一有点担心的特征是概念。由于这是一个如此大的变化,模板出现的相同问题(即完全破坏的实现)是一个真正的危险。

更新发布 FDIS 投票:

碰巧的是,C++ 0x 放弃了“概念”,而 C++ 1x 将再次使用“概念”。最后,除了可能会破坏您的代码之外,还有一些更改auto可能会破坏您的代码,但实际上它们可能非常罕见。主要区别可在FDIS (pdf)的附录 C.2 中找到。

于 2009-05-07T12:55:26.640 回答
12

对我来说,最重要的一项将是:

unique_ptr + std::move() !

想象:

  1. 没有任何开销的智能指针:

    • 没有引用计数操作
    • 参考计数器变量没有额外的存储空间
  2. 可以移动的智能指针,即。移动时没有析构函数/构造函数调用

这给了你什么?异常安全,便宜(指针..)容器,无需任何成本。容器将能够仅 memcpy() unique_ptrs,因此不会因智能指针包装常规指针而导致性能损失!所以,再一次:

  1. 您可以使用指针
  2. 这将是安全的(没有内存泄漏)
  3. 它不会花费你任何东西
  4. 您将能够将它们存储在容器中,并且它们将能够廉价地使用它们进行“大规模”移动(类似于 memcpy)。
  5. 这将是异常安全的

:)

另一个角度来看:

  1. 实际上,当您使用 copy() 移动一组对象时,每个对象实例都会调用构造函数和析构函数。当你复制 1000 个 1kb 大小的对象时,至少会有一个 memcpy() 和 2000 个函数调用。
  2. 如果您想避免数千次调用,则必须使用指针。
  3. 但是指针是:危险的,等等。实际的智能指针对你没有帮助,它们解决了其他问题。
  4. 目前没有解决方案。您必须不时为 C++ RAII/指针/值变量设计付费。但是对于 C++0x,使用 unique_ptr 将允许对对象(是的,实际上是对象,因为指针将是智能的)进行“大量”移动,而无需“大量”构造函数/析构函数调用,并且没有使用指针的风险!对我来说,这真的很重要。

这就像放宽 RAII 概念(因为使用指针)而不会失去 RAII 的好处。另一方面:包裹在 unique_ptr() 中的指针在很多方面都会表现得类似于 java 引用对象变量。不同之处在于 unique_ptr() 一次只能存在于一个范围内。

于 2009-05-07T15:19:52.410 回答
9

您的朋友部分正确,但大部分错误:它是具有额外功能的相同语言。

好消息是,您不必掌握所有新功能。标准机构的主要任务之一是不破坏现有代码,因此您将能够继续,愉快地以您的旧风格进行编码(即使我使用“C++”应用程序,我仍然主要是 C 编码器: -)。

只有当您想查看新功能时,您才需要了解这些更改。如果需要,这是一个可以延长数年的过程。

我的建议是从高层次上了解所有新功能(如果只是在工作面试中听起来知识渊博),但要慢慢学习细节。

于 2009-05-07T12:45:13.013 回答
8

在某些方面,C++0x 应该比当前的 C++更容易教授/学习:

  • 循环通过容器 - 新for语法比for_each+ functor 或使用迭代器手动循环容易得多
  • 初始化容器:我们将能够使用与数组相同的语法来初始化序列
  • 内存管理:out godgy old auto_ptr, in 定义unique_ptr明确shared_ptr

Lambdas 虽然必然比其他语言的等价物更复杂,但比 C++98 在不同范围内定义函数对象的过程更容易学习。

于 2009-05-07T14:07:38.543 回答
7

您打算切换到新标准还是跟上“旧”标准?

一年前,我正在编写严格的 C89,因为所讨论的产品可以积极地移植到嵌入式平台上,其中一些编译器的编译器对于 C99 的哪些部分值得支持有着完全不同的想法。所以一个有 20 年历史的标准仍然没有被它 10 年的继任者完全取代。

所以我不指望能够很快摆脱 C++03。

我确实希望在适当的情况下使用 C++0x 功能。就像我在 C 代码中使用 C99 功能,在 C 和 C++ 中使用 gcc 扩展一样(并且会使用 MSVC 扩展,尽管我从来没有在微不足道的时间内处理过仅 MSVC 的代码)。但我希望它是“很高兴拥有”而不是基线,几乎无限期。

于 2009-05-07T13:18:43.230 回答
7

你说得有道理,但情况一直如此。有很多 C++ 代码仍然没有包含 '98 标准中的任何内容,这仅仅是因为一些编码人员天生的保守主义。我们中的一些人还记得命名空间之前的一段黑暗时期std::(实际上是命名空间之前),当时每个人都编写了自己的字符串类,而指针一直光着身子走来走去。我们谈论“现代 C++ 风格”是有原因的——为了区别于早期的风格,因为有些人仍然需要维护或更新这种风格的代码。

任何语言都必须进化才能生存,任何进化的语言都会有一个分裂的用户群,这仅仅是因为人们在估计将新语言功能应用于自己的工作的机会成本方面的态度不同。

随着 C++0x 在编译器中的出现,这种对话将在世界各地的开发团队中一遍又一遍地进行:

年轻人:我刚刚发现了这些叫做 lambdas 的东西!而且我正在寻找很多方法来使用它们来使我们的代码更具表现力!看,我重写了你以前的 Foo 类,不是更整洁吗?

OLDSTER:我的旧 Foo 课程没有任何问题。您只是在寻找不必要地使用“酷”新功能的借口。为什么你一直试图让我的生活变得如此复杂?为什么我必须不断学习新事物?我们需要另一场战争,这就是我们需要的。

年轻人:你太固执己见了,老头,这些天我们甚至不应该使用 C++……如果由我决定的话——

OLDSTER:如果由我来决定,我们会坚持使用 PL/1,但不……我的妻子不得不投票给 Carter,现在我们被所有这些面向对象的废话所困。没有什么是你可以做的,std::transform而 lambdas 是我不能用一个goto和几个标签做的。

等等

于 2009-05-24T08:14:24.023 回答
5

您的编程生涯将始终涉及学习和再学习。您不能期望 c++ 在您退休之前保持不变,并且使用与 40 年前相同的方法和实践。技术不断发展,而且发展迅速。跟上它是你的工作。当然,您可以忽略这一点,并继续按照您现在的方式工作,但是在 5 到 10 年的时间里,您将变得如此过时,以至于当您尝试换工作时,您将被迫学习所有内容. 那些年以前在工作中学习会容易得多:)

于 2009-05-07T13:18:56.413 回答
4

几个月前,我听到Bjarne Stroustrup发表了题为50 years of C++的演讲。诚然,我不是 C++ 程序员,但在我看来,他当然不认为 0x 是一门新语言!

于 2009-05-07T14:37:39.233 回答
3

无论我们是否可以将其视为“新语言”,我认为这是语义。这没什么区别。它向后兼容我们当前的 C++ 代码,而且它是一种更好的语言。我们是否认为它是“同一种语言”并不重要。

关于学习语言,请记住许多新功能使语言更易于学习和使用。大多数增加复杂性的功能仅适用于库开发人员。他们可以使用这些新功能来制作更好、更高效、更易于使用的库,然后您可以在不了解这些功能的情况下使用这些库。其中一些更改实际上简化并概括了现有功能,使新手更容易学习。

是的,这是一个重大更新,但它以十年来使用当前 C++ 标准的经验为指导。每一个变化都在那里,因为经验表明它是必要的。事实上,委员会非常谨慎和保守,并拒绝了大量其他语言改进。这里添加的只是1)每个人都可以达成一致的基础,2)可以及时指定,不会延迟新标准。

这不仅仅是几个语言设计师坐下来集思广益他们想尝试的新功能。

于 2009-05-07T13:52:42.697 回答
3

概念和概念图将大大增加模板框架的可理解性。如果你曾经倾注过 Boost 源,你就会明白我的意思。您不断地从源代码转到文档,因为该语言没有表达模板概念的工具。希望 Concepts + Duck Typing 能给我们两全其美,模板库的入口点可以显式声明需求,但在编写通用代码时仍然具有 Duck Typing 提供的自由度。

C++0x 中有很多好东西,但它们大多是改进或扩展现有想法的进化变化。我认为这不足以证明将其称为“新语言”是合理的。

于 2009-05-07T14:51:20.717 回答