我是靠谱客的博主 知性钢笔,最近开发中收集的这篇文章主要介绍C++0X(一)1 即将更新的标准可能发生的改变 2 扩展C++的核心语言 3 核心语言性能的提升 4 参考文献 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C++0x(一)

(翻译自wiki 英文)

作成于 2007.5.20

 

 

目录

1 即将更新的标准可能发生的改变... 2

2 扩展C++的核心语言... 3

3 核心语言性能的提升... 4

3.1 右值引用和移动的语义... 4

3.2 一般化常量表达式... 5

3.3 更改了一般的旧数据的定义... 6

4 参考文献... 7


C++0x是计划为C + +语言准备的新标准。它的目标是取代现有的C + +标准--ISO/IEC 14882 ,这个标准是在1998年发表并且在2003年更新过的。这些以前的标准在非正式场合被称为C++ 98C++ 03 。新标准将包含一些对核心语言(core language)的增补,并且将扩展C++标准库,融合C + +技术报告1库(Technical Report 1 libraries)的大部分内容其中最有可能不包含在内的是数学上的特殊函数的库。由于标准尚未最后定稿,这篇文章可能无法反映C ++0x的最新动态。下一代C + +标准的最新动态将公布在国际标准化组织C ++委员会的网站上。最近期的报告N2565 ,发表于20083月。     ISO/IEC JTC1/SC22/WG21C + +标准委员会希望在2009年介绍这个新标准(因此,今天所谓的C ++0x标准将成为C ++09 ),这也就意味着这个标准文件必须在2008年获得国际标准化组织成员国委员会的批准。为了能够按照这个进度表执行,C++标准委员会决定将精力集中在2006年前提交的方案,同时忽略较新的建议     编程语言(如C ++)使用一个进化的过程来发展他们的定义。这个过程中无可避免地产生了与现有的代码的兼容性问题,其中已发生的,而这种问题在C ++的发中只是偶尔发生。不过,根据Bjarne StroustrupC ++语言的发明者和标准委员会的成员)所做的声明,新标准将接近100%的兼容当前标准


1 即将更新的标准可能发生的改变

C + +的修改将包括核心语言和标准库。   在发展新标准的每一个实用性时,标准委员会遵循下面一些方针:         1. 保持稳定性和与C ++98的兼容性,并尽可能与C兼容;         2. 尽量通过标准库引进新特征,而不是扩展核心语言;         3. 更推崇能进化的编程技术的变化;        4. C + +改进为更容易使用的系统,并且改进库的设计,而不是引进一些只对特殊应用起作用的新特征;         5. 增加了类型安全,通过提供一个安全的版本来有选择性的替代目前不安全的版本;         6. 提高了性能和直接与硬件打交道的能力;         7. 提供了为实时领域的更合适的方案;         8. 实施零开销原则(通过一些工具所获得的额外的支持必须满足:只有这个工具被使用时才能获得这种额外支持);         9. 使C ++变得容易教学和学习,但是并不去除任何专家编程所需要的任何工具。         注意初学者是很重要的,因为他们将经常是计算机程序员的主体,因为很多初学者并不打算扩展他们的C + +知识,从而限制了他们在专门的领域来应用 。此外,考虑到C + +的博大精深及其应用(包括应用领域和编程风格) ,即使是最有经验的程序员在一个新的编程范式(programming paradigm)前也能成为一名初学者。


2 扩展C++的核心语言

        C++ 标准委员会的主要精力是发展C++的语言核心。C++0x的介绍日期依赖于标准中核心语言这部分的进程。

        核心语言中有一些值得关注的提升,包括:多线程、泛型编程,统一的初始化式和性能增强。

        这一页的目的在于将核心语言的特征和改变分组为三块通用的部分:性能提升,可用性提升和功能性。一些特征可能隶属于多个部分,但是它们只会在一个部分中被提到,那个部分包含了它们主要来体现的特征。


3 核心语言性能的提升

这个语言特征的存在主要来提供一种性能的好处。他们可能是速度和内存。

 

3.1 右值引用和移动的语义

        在标准C++中,临时变量(终端“右值”, 他们位于赋值表达式的右端)能传递给函数,但是它们只能作为 const & 类型。因此,我们不能分辩一个右值和一个通过 const &来传递的对象。更进一步,因为这种类型为 const &,所以我们不能真实的改变传进来的对象。

    C++0x将增加一种被称为右值引用的新引用类型。这种新的引用类型这样定义:typename &&。这些都能作为非const的值类型来接受,从而允许对象来改变它。这个改变允许确定的一些对象来创建移动的语义。

    例如,从内部来说,std::vector就是一个封装了大小的C类型的数组。如果一个vector的临时变量被创建或者从一个函数中返回,它只有在下面的情况下才能被存储:首先创建一个新的vector,然后复制所有的右值数据到这个新创建的vector中,然后销毁临时变量,删除它所有的数据。

    std::vector的移动构造函数(move constructor)是指它能带一个右值引用到一个vector中。通过使用右值引用,std::vector的移动构造函数能够简单的复制右值的内部C数组的指针到一个新的vector中,留下右值为一个空状态。这个过程中没有复制数组,而且空的临时变量的析构过程中并不释放它的内存。函数返回一个vector类型的临时变量仅仅需要返回一个std::vector<>&&类型。

如果vector没有移动构造函数,拷贝构造函数将像一般情况一样同const std::vector<> & 被调用。如果有一个移动构造函数,那么移动构造函数将被调用。同时,大块内存的申请也将被避免。

    为了安全起见,一个已经命名的变量即使那样声明也不认为是一个右值。为了得到一个右值,应该使用库函数std::move()

 

bool is_r_value(int &&) { return true; }
   
   
bool is_r_value(const int &) { return false; }
   
   
 
   
   
void test(int && i)
   
   
{
   
   
    is_r_value(i); // false
   
   
    is_r_value(std::move(i)); // true
   
   
}
   
   

 

由于右值引用措词的本质,并且对某些改变来说,对于左值的引用(一般的引用)措词,右值引用提供更完美的函数前进。当融合了变量模板时,这种能力能完美的传递参数到另一个含有特别参数的函数。对于传递构造函数参数,这是一个最有用的功能,例如为了创建能自动调用构造函数的工厂函数来传递一些特别的参数。

3.2 一般化常量表达式

C++一直就有常量表达式的概念。像3+4这样的常量表达式将产生相同的结果,并且不会产生边界效果(side effective)。常量表达式给了编译器优化的机会,编译器在编译时间内频繁的执行他们,并且存储在程序中。同时,C++也有一系列地方使用常量表达式。定义一个数组要求使用常量表达式,并且枚举变量也必须是常量表达式。

但是,无论是函数调用还是一个对象构造函数碰到时常量表达式都经常会结束。所以像下面这样简单的情况是违法的

int GetFive() {return 5;}
   
   
 
   
   
int some_value[GetFive() + 5]; //create an array of 10 integers. illegal C++
   
   

 

这不是合法的C++写法,因为GetFive() + 5不是常量表达式。编译器无法在运行时得知GetFive是否为一个常量。理论上来说,这个函数能影响一个全局变量和调用别的非运行时常量等。

C++0x将引进一个新的关键字constexpr,它将允许用户保证一个函数或是一个构造函数是一个编译时的常量,上面的例子能像如下这样重写:

constexpr int GetFive() {return 5;}
   
   
 
   
   
int some_value[GetFive() + 5]; //create an array of 10 integers. legal C++0x
   
   

这就使得编译器来理解和证实GetFive是一个编译时常量。

    在函数中使用constexpr对函数能够做什么添加了一个非常严格的限制。

1.    这个函数必须拥有非void类型

2.    这个函数的返回形式必须是 “return expr”

3.    参数替换后,expr必须是常量表达式。这个常量表达式可能只是仅仅调用其他的定义为constexpr的函数,或是它使用别的常量表达式的数据变量

4.    任何形式的递归在常量表达式中都是禁止的

5.    在转换单元(translate unit)中被定义之前,带有这种标签(constexpr )的函数不能被调用

 

变量也能被作为常量表达式的值被定义:

 

constexpr double forceOfGravity = 9.8;
   
   
constexpr double moonGravity = forceOfGravity / 6;
   
   

   
   
    
     
   
   

常量表达式的数据变量是隐式的常量。它们仅仅能存储在常量表达式的结果中,带有常量表达式的构造函数中。

    为了从用户定义的类型构造常量表达式的数据值,构造函数也能声明为constexpr。一个常量表达式的构造函数必须在它被转换单元使用之前被定义,就如同常量表达式函数一样。它必须有一个空函数体。它必须使用常量表达式来初始化它的成员变量。并且对于这种类型的析构函数也应该是平凡的。

    为了允许他们能从constexpr的函数中通过值返回,复制constexpr 构造类型也应该被定义为constexpr类型。任何一个类的成员函数,像拷贝构造函数、重载操作符函数等,只要他们适合定义为函数常量表达式,都能被定义为constexpr。这能允许编译器在上面复制类,并在上面执行操作等。

    一个常表达式函数或者是常表达式的构造函数都能作为非constexpr类型的参数被调用。如同一个 constexpr 整型字面上来说能被赋值给一个非constexpr的变量,所以一个constexpr的函数也能被非constexpr类型的参数调用。并且结果将存储到一个非constexpr的变量类型中。当一个表达式中所有成员都是constexpr类型时,这个关键词仅仅允许编译时的常属性的可能性。

 

3.3 更改了一般的旧数据的定义

在标准的C++中,为了使结构体被认为是一般的旧的数据( plain old data (POD) ),结构体经常需要定义一系列的规则来约束。

 

=============================(未完待续)============================


4 参考文献

[1]   ISO/IEC DTR 19768 (March 07, 2008) Doc No: N2565 State of C++ Evolution (post-Bellevue 2008 Meeting)

[2]   ISO/IEC DTR 19768 (February 04, 2008) Doc No: N2507 State of C++ Evolution (pre-Bellevue 2008 Meeting)

 

最后

以上就是知性钢笔为你收集整理的C++0X(一)1 即将更新的标准可能发生的改变 2 扩展C++的核心语言 3 核心语言性能的提升 4 参考文献 的全部内容,希望文章能够帮你解决C++0X(一)1 即将更新的标准可能发生的改变 2 扩展C++的核心语言 3 核心语言性能的提升 4 参考文献 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部