当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

C++:最强盛的.NET语言之装箱[VC/C++编程]

赞助商链接



  本文“C++:最强盛的.NET语言之装箱[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
再论范例

  在谈论装箱(boxing)之前,有必要弄清楚为什么值范例与引用范例之间会有所辨别.

  一个含有数值的值范例的实例,和一个指向对象的引用范例的实例,它们有什么辨别呢?除了存储对象所需的内存之外,每一个对象城市有一个对象头,目的是为面向对象的编程供应基本的服务,如存在虚办法的类,嵌入此中的元数据等等.由虚办法和接口间接结合的对象头,其内存开销普通会很大,哪怕你所需求的只是一个静态范例的数值,也会带来一些编译器的强迫操作.风趣的是,在某些情形下,编译器能优化掉一些对象开销,但不老是能起作用.假如你非常在乎托管代码的履行效率,那么利用数值或值范例将会有所好处,但在本地C++的范例中,这不算一个很大的辨别,当然,C++也没有强迫任何编程范式,所以也有大概在C++之上,通过成立库来成立一个这样截然差别的范例系统.

  装箱

  什么是装箱(boxing)?装箱是一种用来桥接数值和对象的机制.固然CLR的每种范例都是直接或间接从Object类派生而来,但数值却不是.一个仓库上的数值(如整形int),只不过是一个编译器会举行某种特定操作的内存块.假如你实在想把一个数值当作一个对象,必须对数值调用从Object担当而来的办法,为了实现这一点,CLR供应了装箱的概念.知道一点装箱的原理还是有点用的,首先,一个数值通过利用ldloc IL指令入栈,接下来,装箱IL指令运行,把数值范例晋升,CLR再把数值出栈,并分配充足的空间存储数值与对象头,然后一个对新建对象的引用被压入栈,全部这些就是装箱指令要做的事.最后,为获得对象引用,stloc IL指令从仓库中弹出引用,并把它存储在部分变量中.

  目前,问题是:在编程语言中,对数值的装箱操作,是应当表现为隐式还是显式呢?换句话说,能否应利用一个显式转换或其他构造函数呢?C#语言计划者决意做成隐式转换,毕竟,一个整形数是从Object间接担当来的Int32范例.

int i = 123;
object o = i;
   问题来了,正如我们所知,装箱不是一个简单的向上转换,它有点像把一个数值转换成一个对象,是一个存在潜在代价的操作.恰是因为这个缘由,托管C++通过利用关键字__box,来举行显式装箱.

int i = 123;
Object* o = __box(i);
  当然,在托管C++中,当装箱一个数值时,不会失去静态范例信息,而这一点,恰是C#所贫乏的.

int i = 123;
int __gc* o = __box(i);
  指定强范例的装箱值有利于再次转换回到一个数值范例,或被称为解箱(unboxing),不利用dynamic_cast,只是简单地解引用一个对象.

int c = *o;
  当然,托管C++的显式装箱所带来的句法上的花销,在很多情形下已被证明是宏大的.正因为此,改变了C++/CLI语言的计划历程,成了与C#保持一致--隐式装箱.在相同情形下,它在直接表示强范例装箱数值上保持了范例安全,而这恰是其他 .NET语言所做不到的.

int i = 123;
int^ hi = i;
int c = *hi;
hi = nullptr;
  在此,也表示着一个没有指向任何对象的句柄,不能被初始化为零,在这一点上,与指针是一致的,因为这将招致只是把数值"零"装箱;同时这也是常量nullptr存在的缘由,它能被赋给任何句柄,且是C#中关键字null的对等物.固然在C++/CLI语言计划中,nullptr是一个新的保存字,但它已被Herb Sutter和Bjarne Stroustrup提议增添在尺度C++中.

编写引用和值范例

   在C#中,普通用关键字class来声明一个引用范例,而用关键字struct来声明值范例: class ReferenceType {}
struct ValueType {}
  关于class和struct,C++已经有定义好了的含义,所以这在C++中行不通.在最初的语言计划上,安排在类前的关键字__gc表示这是一个引用范例,而关键字__value则表示这是一个值范例.

__gc class ReferenceType {};
__value class ValueType {};
  C++/CLI在那些不会与用户的其他标识符发生冲突的地方引入了"空隔"关键字.为了声明一个引用范例,只需在class或struct之前加上ref,近似地,可用value来声明值范例.

ref class ReferenceType {};
ref struct ReferenceType {};

value class ValueType {};
value struct ValueType {};
  关于利用class还是struct,与默许状况下类成员的可见度有关,在CLR中,最大的差别之处在于,只支持公有担当.利用private(私有)或protected(保护)担当都将会招致编译错误,因此,显式声明公有担当是合理但却多余的.


  以上是“C++:最强盛的.NET语言之装箱[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • win8 Could not load type System.ServiceModel.Activation.HttpModule 错误办理筹划
  • 利用Javascript实现网页水印(非图片水印)
  • 在Windows7中将U盘用BitLocker加密的操作步骤
  • rs.open和conn.execute辨别
  • 不用注册机破解Photoshop CS5 每次都需求重新输入注册码
  • CSS网页筹划25个实用小本领
  • CSS3教程:利用@font-face实现本性化字体
  • 办理Windows提醒0xc000009内存错误的办法
  • PHP的chm手册打不开怎么办
  • 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • SQL Server中利用Linkserver衔接Oracle的办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .