快速业务通道

工作中的C++:基本原理,重点推荐和结束语

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

  R r; // 引用类位于栈上?
  r.DoSomething();
  ...
}

在这里,r 看起来像是一个栈对象,但就连 Mopsie 大婶都知道托管类不能在栈上进行物理分配;它们必须从托管堆中分配。那么?编译器可以使这个摘录片断按照期望的方式运行,方法是生成和下面一样的内容:

// 编译器如何才能看到它。
void f()
{
  R^ r = gcnew R; // 在 gc 堆上分配
  try
  {
   r->DoSomething();
   ...
  }
  finally
  {
   delete r;
  }
}

对象不存在于物理栈上,但谁又介意呢?重要的是局部变量语法按照任何一个 C++ 程序员都会期望的方式运行。特别是,r 的析构函数在离开 f 前被调用。而说到析构函数,同理解释了 C++/CLI 恢复决定性析构的原因:这样,析构就遵循了每个 C++ 程序员都熟悉并喜爱的相同语义。好啊!非决定性析构是托管扩展最痛苦的事情之一。C++/CLI 将析构函数映射到 Dispose 并为终结器引入特殊的 ! 语法。直到垃圾收集器抽出时间时,引用对象使用的内存才会被收回,但这没什么大不了。C++ 程序员不怎么在乎一个对象被销毁时收回内存;在乎的是析构函数可以在期望运行时运行。C++ 程序员经常使用构造/析构模式来初始化/释放非内存资源(像文件句柄、数据库锁等)。使用 C++/CLI,对于引用和本机类,熟悉的构造/析构模式就会像您预期的那样运行。Redmondtonians 值得信任,因为他坦白承认托管扩展存在的问题 - 还因为他处理了这些问题。

未来的乐趣

在“基本原理”更吸引人的章节中,有一个称为“Future Unifications”(未来统一化)的章节。它给出了一些关于 C++/CLI 未来走势的引人入胜的提示。例如,本机类当前无法从托管类派生,反之亦然。但可以获得同样的效果,解决办法是:将“基”类作为数据成员,然后编写 passthrough 包装程序,该包装程序只起到调用包含的实例的作用。哦,这个听起来挺老套,那么为什么编译器做不到呢?编译器可以将混合对象作为分成两部分的对象表示,其中一个是包含所有 CLI 部分的 CLI 对象,另一个是包含所有 C++ 部分的 C++ 对象。

在这里,Sutter 报道了一个有趣的轶事:当他第一次向 Bjarne Stroustrup 表明这个混合类的主意时,Bjarne 走向书架“然后打开一本书,其中写道他一贯坚持(不管批评)C++ 不必要求对象在一个单独的内存块中连续排列。”那时,没有人看到非连续对象有任何好处 - 但那时也没有谁预料到 .NET 和 CLI。Bjarne 坚持敞开非连续的大门使得混合对象成为可能。如果在未来的 C++/CLI 版本中看到它们,不要惊讶。而寓意就是:当您正在设计一种期望会永久存在并会以不可预计的方式发展的新的语言或复杂的程序时,请不要做不必要的设想,因为这样会让生活更轻松!

“基本原理”提供了另一则有趣的历史珍闻:Redmondtonians 原来为 C++/CLI 取的内部名称是 MC^2。正如在 M(托管)C(++) 中,有一个致与 Albert Einstein 的帽尖 (^)。但正如 Sutter 所说的,那样“太矫揉造作”。我同意。您真的认为如果它被称作 MC^2,大家就会热烈接受 C++/CLI 吗?在决定将其称为 C++/CLI 方面,架构师再一次沿着 Bjarne 的足迹。Bjarne 说:“我选择了 C++,因为它简短、有很好的释义,而且它不是‘修饰的 C’的形式”。C++/CLI 表明 C++ 在前,而且还谨慎地避免了“修饰的 C++”的形式。

“基本原理”证明了其他的 C++/CLI 扩展(像 property、gcnew、generic 和 const)是有效的,并以很有用的常见问题解答部分结束。有关详细信息,请下载“基本原理”自行阅读。说到 const,回到我最初的问题 - 为什么 C++/CLI 允许 const 数据,但不允许 co

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号