1 / 34

VC++ 2005 :基础概览

VC++ 2005 :基础概览. 讲师:李建忠. 上海祝成科技 高级讲师. Agenda. 第一个 C++/CLI 程序 栈对象语义的变化 通用语言基础构造 CLI ISO-C++ 与 CLI 的集成 讲座总结 Q&A. Hello,World!. using namespace System; int main() { String^ msg =gcnew String("Hello, World!"); Console::WriteLine(text); }. 追踪句柄 ^ VS. 指针*.

anahid
Download Presentation

VC++ 2005 :基础概览

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VC++ 2005:基础概览 讲师:李建忠 上海祝成科技 高级讲师

  2. Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A

  3. Hello,World! using namespace System; int main() { String^ msg =gcnew String("Hello, World!"); Console::WriteLine(text); }

  4. 追踪句柄^ VS. 指针* • String^ msg; //C++/CLI版 • string * pMsg; //ISO-C++版 • 为什么不直接采用ISO-C++指针的表示法?内容决定形式,形式反映内容——垃圾收集导致对象地址的不稳定。

  5. gcnew VS. new • msg=gcnew String("Hello, World!"); • pMsg=new string("Hello, World!"); • delete msg ? //仅仅用来调用析构函数以释放非托管资源,托管内存资源交由垃圾收集器负责(调用可选) • delete pMsg // 不仅用来调用析构函数,同时也用来施放对象内存(必须调用,否则造成内存泄漏)

  6. 托管堆 VS. 本地堆 • 托管堆-垃圾收集自动服务 • 本地堆-程序员自己负责 • 托管堆由于垃圾收集服务的介入,影响了对象地址的稳定性,大大改变了对象模型

  7. 编译结果分析 • 通用中间语言(CIL) • 元数据(Metadata) • CIL与Metadata都是在软件体系结构中增加了一层间接(indirection)来实现一种抽象(abstract),从而对系统做更高层次的演绎和拓展

  8. Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A

  9. 定义一个类型 ref class MyClass{ public: MyClass(){ Console::WriteLine("ctor"); } ~MyClass(){ Console::WriteLine("dtor"); } };

  10. 栈对象的分配 • MyClass myObject; • 在ISO-C++中,myObject被分配于栈上 • 在C++/CLI中,myObject的分配依赖于类型系统。值类型(value class):分配在栈上,引用类型(ref class):分配在托管堆上

  11. 栈对象的消亡 • 在ISO-C++中,在清空栈空间时,会自动调用MyClass的析构函数,并且myObject在栈上的空间也随之被释放 • 在C++/CLI中,在清空栈空间时,也会自动调用MyClass的析构函数,但myObject要视MyClass的类型来定,如果是value class,那么其空间会随之被释放;如果是ref class,那么其在托管堆上的内存要交给垃圾收集器来处理

  12. 栈对象的地址运算 • 在ISO-C++中: MyClass* pMyObject=&myObject; (*pMyObject).MyMethod();//解引用 • 在C++/CLI中: MyClass^ pMyObject=%myObject; (*pMyObject).MyMethod(); //解引用

  13. Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A

  14. CLI是什么? • CLI全称为通用语言基础构造(Common Language Infrastructure) • CLI是一个虚拟机平台 • CLI同样是增加了一层间接(indirection)来实现一种抽象(abstract),它定义了一个介于操作系统和应用程序软件之间的组件平台

  15. CLI的组成部分 • 通用类型系统(Common Type System,简称CTS) • 元数据 (Metadata) • 通用语言规范(Common Language Specification,简称CLS) • 虚拟执行系统(Virtual Execution System,简称VES) • 其他:如可移植文件(portable file)格式,通用中间语言指令集,标准编程框

  16. 通用类型系统(CTS) • 类型规范 • 任何一门CLI编程语言中提供的类型和成员都是CTS的一个子集 • C++/CLI是目前对CTS描述最为完整的高级语言

  17. 元数据 (Metadata) • 元数据是CLI组件平台的灵魂 • 元数据赋予了无限的组件管理、服务、动态能力 • C++/CLI与ISO-C++的本质区别就在于对元数据的支持

  18. 通用语言规范(CLS) • CLS是用以确保所有CLI语言能够互操作的一组规则 • 它定义了所有CLI语言都必须支持的一个最小功能集(一个CTS的子集) • 各CLI语言可以选择自己对CTS的一部分的映射,但是它至少应该支持CLS所定义的最小功能集

  19. 虚拟执行系统(VES) • VES为CLI程序提供了一个在各种可能的平台上加载和执行托管代码(即通用中间语言指令集)的虚拟机环境。 • VES实现并贯彻了CTS模型 • VES定义了一个相关的机器模型和状态、一组控制流构造,以及一个异常处理模型

  20. Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A

  21. 何为集成? • C++/CLI支持对本地编程和托管编程的无缝集成 • 集成不是简单混合,而是对象模型的集成

  22. 最简单的集成 #include <iostream> #include <string> using namespace std; int main(){ string msg="Hello, World!"; cout<<msg; } 直接使用cl /clr 编译即可

  23. IJW(it just works) • 绝大多数ISO-C++代码编译后将得到托管代码,即IL代码。部分不能编译为IL代码的采用P/Invoke调用实现 • 代码托管,但数据并不托管——原来ISO-C++中本地堆内的数据仍位于本地堆中

  24. 更有价值的集成 #include "TextQuery.h" public ref class TextQueryCLI { TextQuery *pquery; public: TextQueryNet() : pquery( new TextQuery()){} ~TextQueryNet(){ delete pquery; } void query_text() { pquery->query_text(); } void build_up_text() { pquery->build_up_text();} };

  25. 更深层次的集成(1) 在一个托管类中包含本地对象 ref class ManagedClass{ NativeClass nObject; };

  26. 更深层次的集成(2) 在一个本地类中包含托管对象 class NativeClass{ ManagedClass mObject; };

  27. 更深层次的集成(3) 将一个本地对象放在托管堆中 NativeClass^ nObject = gcnew NativeClass;

  28. 更深层次的集成(4) 将一个托管对象放在本地堆中 ManagedClass* pmObject = new ManagedClass;

  29. Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A

  30. 讲座总结 • 以史为鉴,可以知兴替 • 从小处着手,建立清晰的程序观念 • 从大处着眼,建立宏观的知识体系 • 良好的ISO-C++基础很重要

  31. Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A

  32. Q & A

  33. 资源链接 • msdn.microsoft.com/visualc • comp.lang.c++.moderated • blogs.msdn.com/slippman • pluralsight.com/blogs/hsutter • blog.joycode.com/lijianzhong • www.chinaitclub.org/forums/

More Related