注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

旅行报告:2007年十月ISO C++标准大会  

2007-11-03 19:14:53|  分类: 翻译 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文译自:http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!330.entry

这篇文章是Sutter写的大会总结。不过……按照大会的行程安排,这确实是次名副其实的旅行报告,大家看到最后就知道了。(老外也习惯公款旅游啊,虽然这公款应该都是各大公司集资来的,不是像某国特色花纳税人的钱吧……)

以下是译文:

ISO C++委员会于十月1号到6号在Kona(为啥不是Konata?为啥不是Kagami?>_<)碰了个头。这篇文章简单记录了我们都做了啥,以及将来碰头的一些信息。

C++ 0x是什么,何时发布?

正像我以前blog里说的(最近的是这里这里),ISO C++委员会一直在为C++的下一个主要修正版本工作,这个版本不正式的叫法是C++ 0x,会在语言本身和标准库里加入一些广受欢迎的修正和增强。

委员会决定在2009年完成这个标准的技术工作。为了达到这个目标,我们计划在2008年九月发布一份完整特性的草案,然后用一年的时间来精心修改草案,以满足公众对草案的反馈和编辑上的修改。

值得注意的是,这个时间表与我年初在blog里提到的时间表大概有一年的差距。(那时我说2007年十月份会给出草案)为什么会有差距?我们还有一些重要的特性没有“checkin”(签入,其实是指大家还没讨论清楚利益分配之类的……)到文档中,因此离草案的发布还很远。有三个值得注意的特性:
  • concept(概念?这东西貌似还没有标准译法)(一种表示模板约束的方法,这个方法可以让我们得到更好的错误信息,重载和泛型模板的应用)
  • 高级并行库(比如,线程池和读写锁)
  • 垃圾收集
我们这次会议最重要的一件事情,大概就是选择时间范围了:我们认为C++ 0x不能没有concept,但是可以,估计也应该,不会有另外两个或者其中某一个了。(gc啊~~~我要gc啊~~~给我gc啊~~~~~~T_T)

并发:这次会议围绕并发展开。我们为一大堆并发的扩展工作投票,因为他们正好在这个时间点都准备好了,所以这次会议里它们都进入了工作草案(下面是细节):
  • 内存模型
  • 原子库
  • 基础线程,锁和条件变量
我们决定基本上,并发工作就这样了;我们依旧计划往C++ 0x里加入一个异步的future<T>类型,但是像内存池这类特性将被推迟到这个标准以后再讨论。

垃圾收集:对C++ 0x,我们不会明确的加入对垃圾收集的支持,而是仅仅打算移除目前C++实现中那些阻碍实现垃圾收集的特性,比如隐藏指针的问题(这是什么问题?我咋没听说过?)。特别的,这个特性估计会被约束在以下几点:
  • C++ 0x将包含“使一些伪装指针的用法成为未定义的”(其实就是要求避免使用一些隐藏指针的用法,话说我还是不知道啥是隐藏指针),”加入一组小函数,以使特定的对象从其约束中解脱出来,或者标明某块内存是不能引用的“(在仅考虑非垃圾收集的C++实现里,并不强求实现这些函数。)
  • C++ 0x不会包含明确的语法或函数去支持垃圾收集及其相关特性,比如终结器(finalization,C#里好像是这么翻,java呢?)。这些将在C++ 0x发布后再考虑。
我们都往C++ 0x草案里塞了些什么东西?

这是一份在这次会议里加入C++ 0x草案的主要特性的列表,以及相关论文的链接。可以通过论文获得更多信息。

nullptrN2431

这是一个来自C++/CLI的扩展,可以用nullptr来明确指明空指针,来代替那个不能用来重载的字面量”0“(包括那个写成NULL的宏)。以前的方法实在没法区分是null还是整数0。这个提议是我自己(不是我>_<)和Bjarne写的。(老外不是把自己放在最后么?怎么这里反了?)

明确的转型运算符N2437N2434

你知道怎么在C++里写一个需要明确调用的转型构造函数吧?
class C {
public:
  C( int );
  explicit C( string );
};

void f( C );

f( 1 ); // 没问题,从int隐含转换到C
f( "xyzzy" ); // 错误,不能从字符串常量隐含转换到C
f( C("xyzzy") ); // 没问题,明确转换到C

但是C++有两种方法写隐式转换(恩,”茴“字也有四种写法:钢笔写,铅笔写,圆珠笔写,签字笔写……话说鲁迅大人您躺好,不用让鲁达来找我了……):像上面一样用一个单参数的构造函数来”从“某个类型转换,或者像下面一样用转型操作符转换”到“其他的类型。现在,下面的第二种方法,也可以标识为“明确”的了:
class C {
public:
  operator int();
  explicit operator string(); // <-- 新特性
};

void f( int );
void g( string );

C c;
f( c ); // 没问题,隐式从C转换到int
g( c ); // 错误,不能隐式从C转换到string
g( string(c) ); // 没问题,明确转换到string

现在,这个特性对称了,太酷了。(哭了,这就是为了追求艺术的美感么?T_T)在论文N2434可以找到C++标准库内部是怎么使用这个特性的。

并发内存模型

在我写的《免费午餐结束了》(《程序员》有一期翻译了这篇文章,但我找不到了,名字好像也不是这个)里,芯片设计者和编译器实现者“在面对越来越快的CPU面前压力重重,他们冒风险改变你的程序的意思,甚至有可能弄坏程序,来让它跑的更快些。”(指编译器的全局优化和CPU的乱序执行)在多核和多处理器面前,这种情况只会变得更糟。

内存模型可能是程序员之间,也可能是优化者之间,的底层契约,也是所有高层并发工作的基础。引用一段我的内存模型论文的话:“一个内存模型描述了(a)处理器如何根据程序的要求对内存进行读写,和(b)一个处理器的写操作如何让其他处理器可见。这两个方面都会影响编译器、物理处理器和缓存的有效优化手段,也因此,内存模型的定义要权衡可编程性(给程序员以强有力的保证)和性能(给重组程序的内存操作以极大的灵活性)。”

原子类型(N2427

与内存模型相关非常紧密的是原子类型特性,这个特性可以安全的用于无锁并发。在C++ 0x里,这个特性写作“atomic<T>”。这有个例子,展示了如何利用这个特性在单体控件的实现里写出正确的(是的,正确的!)双确认锁:
atomic<Widget*> Widget::pInstance = 0;

Widget* Widget::Instance() {
  if( pInstance == 0 ) { // 1: 第一次确认
    lock<mutex> hold( mutW ); // 2: 请求锁(进入临界区域)
    if( pInstance == 0 ) { // 3: 第二次确认
      pInstance = new Widget(); // 4: 创建并赋值
    }
  } // 5: 释放锁
  return pInstance; // 6: 返回指针
}

线程库N2447

你可能注意到上面的例子用到了lock<mutex>。这些也已经在标准草案里了。C++ 0x现在包括了对线程、不同特性的信号量和锁和条件变量的支持,同时也有一些其他,但很有用的并发辅助函数,像高效且可移植的std::call_once

其他一些被批准的特性

  • N2170 "字面上的通用字符名称"(真想翻成宇宙字符名称)
  • N2442 "原生和Unicode常量字符串;统一方案(修订版2)"
  • N2439 "扩展对*this的move语义(改后的措辞)"(move语义就是r-value,印象里是。翻译成“转移语义”?)
  • N2071 "能适当的从struct tm对象抽取或插入的Iostream制造者"(struct tm是个什么东东……)
  • N2401 "关于C++标准库代码转换的方方面面"(翻的极为不知所云……)
  • N2440 "放弃进程"(不懂……)
  • N2436 "固定的小内存分配器"(这个懂了)
  • N2408 "简单数值的访问修正2"
下次会议

这是ISO C++标准委员会的下次会议,和可以提供会议信息的链接。
  • 2008年二月24日到三月1日:Bellevue,Washington,美国(N2465
  • 2008年六月8日到14日:Sophia Antipolis,法国
  • 2008年九月14日到20日:San Francisco Bay area,California,美国(这个只是预定的时间)
这些会议是公开的,如果你到时恰好在那里,可以用顺便来看看。

(看这个时间表,所以我说这根本就是个旅行报告嘛~~~~>_<)
  评论这张
 
阅读(1090)| 评论(13)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017