C ++ 0x噪音,膨胀和可移植性

时间:2009-08-12 15:17:15

标签: c++ c++11 portability

刚开始看到即将到来的C ++ 0x标准时,我很高兴,并不是说我很悲观,但是现在想起来我觉得有点不太乐观。

主要是因为三个原因:

  1. 很多提升膨胀(必须导致无望的编译时间?),
  2. 语法似乎很长(不像我最初希望的那样是Pythonic),而且
  3. 我对便携性和其他平台(iPhone,Xbox,Wii,Mac)非常感兴趣,“标准”需要很长时间才能获得足够的便携性吗?
  4. 我认为#3的风险较小,从过去十年的模板中吸取了教训;然而魔鬼的细节。

    编辑2(试图减少奇思妙想):您是否认为公司在标准的第一个有效年份过渡到C ++ 0x是安全的,或者是否与之相关风险很大?

8 个答案:

答案 0 :(得分:14)

  1. 您只需支付使用的费用。如果您不需要复杂的模板功能,请不要#include其定义的标头,您也不必处理它。
  2. Lambda函数应该减少STL算法的冗长程度;和auto变量将有助于std::map<foo, std::shared_ptr<std::vector<bar> > >::const_iterator ...
  3. 等代码
  4. 是的,需要一段时间。许多新功能确实在推动,如果你想要可移植性,那么在标准实施后至少几年你应该使用它。幸运的是,只有两个编译器涵盖了你提到的平台:g ++和微软的C ++编译器。一旦获得支持,嵌入式工具链使用新版本重建只是时间问题。不幸的是,可能很多时间......

答案 1 :(得分:13)

  

编辑:我(以及像我这样的其他人)是否必须密切关注构建时间,无法读取的代码和缺乏可移植性,并进行大规模原型设计以确保继续使用新标准?

是。但是你必须使用当前标准来做所有这些事情。我没有看到它在C ++ 0x上变得更糟。

C ++构建时间总是被吸引。但是,没有理由为什么C ++ 0x应该比现在慢。与往常一样,您只需要包含所需的标题。据我所知,每个标题都没有明显变大。

当然,概念是这里最大的未知数之一,人们担心它们会大大减慢编译时间。这是他们被削减的众多原因之一。

如果你不小心的话,C ++很容易变得难以理解。再一次,没有新的东西。而且,C ++ 0x提供了许多工具来帮助最小化这个问题。 Lambda不像Python或SML那么简洁,但它们比我们今天定义的算子更具可读性。

至于可移植性,C ++已经是一个雷区。没有给出整数类型大小的保证,也没有字符串编码的保证。在这两种情况下,C ++ 0x都提供了修复它的工具(使用特定于Unicode的char类型和保证固定大小的整数)

即将出台的标准指出了一些目前阻碍可移植性的问题。

总的来说,是的,你提到的问题是真的。它们存在于今天,它们将存在于C ++ 0x中。但据我所知,C ++ 0x减少了这些问题的影响。这不会让他们变得更糟。

您说得对,合规标准在所有平台上都可用,需要一段时间。但我认为这将是一个比C ++ 98更快的过程。

所有主要的编译器供应商似乎都非常热衷于C ++ 0x支持,这在上一次并非如此。 (可能因为那时候,它主要是调整和修复它们已经实现的预标准功能的问题,因此更容易声称你的预标准编译器“几乎几乎与C ++ 98兼容”。

我认为总的来说,C ++社区比十年前更注重标准和前瞻性。如果你想出售你的编译器,你将不得不认真对待C ++ 0x。

但是,从完全(或大部分)兼容的编译器可用到标准发布之前,肯定会有几年的时间。

答案 2 :(得分:10)

与大多数C ++一样,您只需支付所需费用。因此,如果您不想要有用的跟踪指针,线程库等的“增加膨胀”,那么您不需要为编译付费。

我非常确定可移植性将通过设计来解决,特别是因为很多是基于来自boost等项目的现有可移植代码。正如您从各自的当前原型版本中看到的那样,GCC和Microsoft VC已经实现了大部分C ++ 0x。

答案 3 :(得分:6)

  1. C ++总是会有无望的编译时间,它的整个哲学就是做一次(即在编译时这样做),所以你不必在运行时重复它并降低性能。正如其他人所说,如果你不需要它,不要包括图书馆!
  2. C ++永远不会是pythonic,因为它的目标是向后兼容。冗长来自于一种古老的语言,随着语言的演变而增加了很多东西。正如其他人所说,lambdas和auto变量也将大大降低冗长度
  3. 这对语言的任何重大更改都存在问题,但我认为这些更改会使语言更容易使用,因此应该快速采用。

答案 4 :(得分:3)

我认为#3是短期内最大的风险。 AFAIK,标准是在几个领域(lambdas)中引入新语法并改变先前单词(例如auto)的含义。使用这些功能的代码只有在您部署的每个平台的编译器都支持它们时才能移植。

当然,这会在某个时间点发生。但是为编译器添加新功能并不是一件容易的事,需要花费很多时间。我担心在主编译器中支持这些功能需要很长时间,因此会妨碍程序员成为早期采用者和便携式计算机的能力。

答案 5 :(得分:2)

我发现C ++ 0x在很多情况下使代码更加清晰。

由于可变参数模板,在处理模板化程度很高的代码时,构建时间会大大缩短。 boost ::使用一个非常难看的模板重载方案来在C ++ 98中实现“variadic templates”。这导致编译时间吹过屋顶。 Link

基于范围的for循环在可读性方面也很棒。

考虑C ++ 98-ish:

for (std::vector<int>::const_iterator itr = vec.begin(); itr != vec.end(); ++itr)
   foo(*itr);

现在可以编写(在G ++ 4.6中实现):

for (auto elem : vec)
   foo(elem);

auto关键字也会降低语法噪音。

Lambda非常适合与STL算法一起使用,并且当您不必单独创建C样式回调函数甚至整个类时,它使其更具可读性。

答案 6 :(得分:1)

标准事物的一个优点是编译器可以采用快捷方式。例如。如果您只需切换到is_ X {{1},那么实施<U> X __compiler__is_所需的提升模板马戏团就会消失}。这可以轻松地节省2个数量级,有时是3个。

答案 7 :(得分:0)

这里有什么问题?当然,在神秘平台上的编译器实现这些功能之前需要花费数年的时间。不要指望能够使用新功能,直到3年,也许将来5年。 “就像我们用荷兰语说的那样,那些生活,然后担心的人”。