C++0x设计之路(3)

2008-03-28 07:32:54来源: 阅读 ()

新老客户大回馈,云服务器低至5折

auto p = find(tbl,x);

 

// tbl is a const vector<int>

 

// p becomes a vector<int>::const_iterator

 

      为帮助新人而加入的特性(包括所有层次的技术和意见)不应与语言其它部分隔离而治,自成一派,形成一些新人卫星城一类的东西。和所有的特性一样,他们应该能在主要的系统内得到应用,和其他特性平滑互动,并且为进一步学习完整的语言和标准库提供一条道路。

 

      总结:C++0x必须为各种程度的初学者提供比现有的C++更好的支持——这包括减少易错的语言特性和提供更多的支持库。

 

类型安全

 

对于缺乏类型安全的问题,最直接的解决方案就是提供一个以静态类型为基础的带范围检查的标准库,并且在C++的教学中以其为基础。

 

      优雅和高效的代码的秘诀就是建立在灵活和易扩展的类型系统之上的类型安全。C++0x不可能使得C++达到完全的类型安全——这样将会导致数组、未初始化指针、联合、窄向转型、C风格的链接以及更多的功能都不可使用。这样做同样会让在很多嵌入式系统中所必需的对硬件的存取操作产生问题。那么,我们能怎么做?类型安全的缺乏是很多易错的,效率不佳的问题的根源所在。例如:

 

      void get_input(char* p)

 

      {

 

          char ch;

 

          while (cin.get(ch) && !iswhite(ch)) *p++ = ch;

 

          *p = 0;

 

      }

 

这段代码就足以让人心生寒意,惶惶然不知如何是好。同样的,如果你对效率极其关注,下面这种通用的链表的实现方法相信也难以让你满意:

 

struct Link {

 

    Link* link;

 

    void* data;

 

};

 

void my_clear(Link* p, int sz) // clear data of size sz

 

{

 

    for (Link* q = p; q!=0; q = q->link) memset(q->data,0,sz);

 

}

 

我们该怎么办?基本上,我们所能做的,就是为那些不安全的操作提供其他的可选途径,并且依靠工具的帮助来检测那些不安全的(通常也是传统的)用法。例如:

 

string s;

 

cin >> s;

 

这个替代品完美地解决了前面的那个低级而臃肿的get_input()所具有的问题;而对于第二个问题,既明了又高效(至少具有高效的潜力)的解决方案很干净利落:

 

template<class In> void my_stl_clear(In first, In last)

 

{

 

    while (first!=last) *first++ = 0;

 

}

 

这个可以作为my_clear()的一个完美的替代品。my_clear()的问题在哪?当然,从代码行数而言,它比my_stl_clear()更长一些,不过在考虑效率问题的时候,这并不是关键所在。问题的关键在于它缺乏类型信息。这意味着编译器必须假设在往q->data写入时(也就是memset中),*(q->link)的内容甚至q->link本身都有可能改变。这基本上就让优化器在此毫无用武之地。而一旦我们能够静态地确定datalink是两种不同类型,编译器就可以认为这两者不会相互影响。所以,在有一个还可接受的优化器的情况下,my_stl_clear()应该要比my_clear()快很多倍。另外,由于我们使用了void*类型,为了存取其内容,我们不得不使用一些折衷的办法,memset()的使用就是一例:在这种情况下,我们最后经常被迫使用函数——甚至是间接调用的函数——来达到目的。而这样做,有时其开销是巨大的。

 

对于缺乏类型安全的问题,最直接的解决方案就是提供一个以静态类型为基础的带范围检查的标准库,并且在C++的教学中以其为基础。当然,这样做也无法消灭全部的类型错误——很多时候,程序员会选择采用硬编码的原语的风格来写程序,这样做的原因有很多,而在程序员决定要这样做的时候,他们则必须关闭检查。另外,还存在另外的很多很多标准库尚未涵盖的领域。而这个问题的解决则要求标准库设立一个标准,要求其他的类库遵照此标准与其协同工作。

 

一个系统地采用范围检查的标准库必然要求系统地使用异常,这对于那些实时性要求不甚严格的程序而言并没有问题。而且现在我们也已经知道应该如何处理异常了(请参考[5]的附录E)。

 

总结:C++0x并不能完全填补现有C++的类型体系的漏洞,可它将不会引入新的漏洞,并且将会提供一些避免那些先天不足的设施的方法——主要是通过标准库提供一套类型安全(编译时或者运行时)的替代品。

 

效率和机器模型

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C++ 0x 里的垃圾收集器

下一篇: Visual C 设计UDP协议通讯示例