赛迪网 > IT技术 C/C++ > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Stan Lippman:C++/CLI全景体验 (3)

发布时间:2006.03.09 05:23     来源:赛迪论坛    作者:sixth

学习 C++/CLI 的第二个要点是学习我们选择直接提供给程序员操作的那些底层 CLI 元素。例如, CLI 为所有语言都提供了垃圾收集服务。一门语言不能选择是否支持垃圾收集,而只能选择如何更好地提供该服务。

  在 CLI 中,一个引用类型的所有对象都只能被分配在 CLI 托管堆上。这意味着 C++/CLI 支持两种动态堆——本地堆(没有任何形式的自动内存回收机制),和 CLI 托管堆。对于这两种动态堆,开发人员通常要用某种形式的 new 操作符来分配对象;如果操作成功,对象在堆中初始位置的地址将被返回。但是两者又有所区别,这是因为 CLI 托管堆中对象的位置有可能在垃圾收集器的清除以及随后的压缩中被重新调整。如果一个对象的位置被重新调整,那么 CLI 运行时中所含的其中一项服务会透明地更新所有引用该对象的指代品( thingee )。

  这就使得我们面临着一种困难的选择:我们是将这些指代品称为指针,并且继续用指针的语法来表示它们呢?还是引入一种新的类似的语法来表示它们需要特殊的处理?我们最后决定采用后者,看下面的代码:

  N *pn = new N;

  R ^rn = gcnew R;

  这里, N 表示一个本地类型,而 R 表示一个 CLI 引用类型,帽子状的符号( ^ )表示相关的地址是一个托管堆上的追踪句柄( tracking handle )——也就是说,对象位置的任何重新调整都会被 CLI 所追踪,相应的句柄也会被透明地更新。其中关键字 gcnew 在这里被用作与 CLI 托管堆打交道的 new 表达式。

  值类型事实上也可以位于托管堆上,虽然这并非必须。当它们作为一个引用类型的成员时,就会出现这种情况。如果我们允许获取一个引用类型内部成员的地址,那么本地指针也是不合适的,因为这些成员的位置也需要被追踪。一种解决方法是简单地禁止该项功能。这样语言当然会变得更加简单,但是同时语言也会变得更弱——例如我们将不能通过增长元素的地址值来遍历 CLI 数组,这是因为 CLI 数组是一个引用类型,其内的元素都位于托管堆上。不提供这样的功能意味着 CLI 数组将不能适用于标准模板库( STL )中的 iterator 模式以及泛型算法。对于一个 C++ 程序员来说,这是不可接受的。

  支持获取可能位于托管堆中的值类型的地址同样需要引入一种追踪指针,我们称之为追踪内部指针( tracking interior pointer )。另外,我们还支持追踪引用( tracking reference )这样的概念——它具有类似本地引用的别名语义,但是它会在必要的时候被 CLI 透明地更新。最后,我们还支持一种固定指针( pinning pointer )的概念,它可以在该指针的作用范围内阻止垃圾收集器移动其所引用的对象。

  这些新的符号及其表示的复杂的间接类型是在我们对托管堆反复学习和认识之后产生的。面对生存期短暂的托管堆对象,我们需要某种精巧的方式来认识和使用它们,我们相信这些额外的间接类型可以给大家很多帮助。我们将在今后的专栏文章中详细讨论它们。

  我们在此对一门 CLI 语言所选择的第二个设计层面表示了其对底层 CLI 实现模型的一层映射。选择什么样的映射取决于该编程语言定位于什么样的程序及程序员模型。当你选择一门 CLI 语言进行编程的时候,你实际上也是在选择遵从一种程序员模型。我们对于 C++/CLI 程序员的定位是那些历练较深的系统程序员,这些程序员通常所面对的任务是为高层的商业逻辑提供基础性的构造和关键性的应用,这时候她就必须要同时考虑系统的扩展性和性能,因此必须对底层 CLI 有一个系统级的视角。

<<上一页 1 2 3 4 5 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 用VC++制作播放AVI视频流的动画按钮 (03-07) · Visual C++ 6.0编程实现打印功能 (03-02)
· VC++串口编程之短信应用开发 (02-24) · 学习C++编程语言的最大难度是什么 (02-24)
· Linux下C++程序的异常处理技巧 (02-22) · 澄清 Java 的接口与继承机制 (01-04)
· 如何在C/C++中调用Java (02-17) · 微软下一代VS.NET开发包现形 (11-19)
· Oracle欲将全部业务转到Linux (11-14) · Borland推出移动版C++开发工具 (11-14)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管