340 likes | 528 Views
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. 指针*.
E N D
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. 指针* • String^ msg; //C++/CLI版 • string * pMsg; //ISO-C++版 • 为什么不直接采用ISO-C++指针的表示法?内容决定形式,形式反映内容——垃圾收集导致对象地址的不稳定。
gcnew VS. new • msg=gcnew String("Hello, World!"); • pMsg=new string("Hello, World!"); • delete msg ? //仅仅用来调用析构函数以释放非托管资源,托管内存资源交由垃圾收集器负责(调用可选) • delete pMsg // 不仅用来调用析构函数,同时也用来施放对象内存(必须调用,否则造成内存泄漏)
托管堆 VS. 本地堆 • 托管堆-垃圾收集自动服务 • 本地堆-程序员自己负责 • 托管堆由于垃圾收集服务的介入,影响了对象地址的稳定性,大大改变了对象模型
编译结果分析 • 通用中间语言(CIL) • 元数据(Metadata) • CIL与Metadata都是在软件体系结构中增加了一层间接(indirection)来实现一种抽象(abstract),从而对系统做更高层次的演绎和拓展
Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A
定义一个类型 ref class MyClass{ public: MyClass(){ Console::WriteLine("ctor"); } ~MyClass(){ Console::WriteLine("dtor"); } };
栈对象的分配 • MyClass myObject; • 在ISO-C++中,myObject被分配于栈上 • 在C++/CLI中,myObject的分配依赖于类型系统。值类型(value class):分配在栈上,引用类型(ref class):分配在托管堆上
栈对象的消亡 • 在ISO-C++中,在清空栈空间时,会自动调用MyClass的析构函数,并且myObject在栈上的空间也随之被释放 • 在C++/CLI中,在清空栈空间时,也会自动调用MyClass的析构函数,但myObject要视MyClass的类型来定,如果是value class,那么其空间会随之被释放;如果是ref class,那么其在托管堆上的内存要交给垃圾收集器来处理
栈对象的地址运算 • 在ISO-C++中: MyClass* pMyObject=&myObject; (*pMyObject).MyMethod();//解引用 • 在C++/CLI中: MyClass^ pMyObject=%myObject; (*pMyObject).MyMethod(); //解引用
Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A
CLI是什么? • CLI全称为通用语言基础构造(Common Language Infrastructure) • CLI是一个虚拟机平台 • CLI同样是增加了一层间接(indirection)来实现一种抽象(abstract),它定义了一个介于操作系统和应用程序软件之间的组件平台
CLI的组成部分 • 通用类型系统(Common Type System,简称CTS) • 元数据 (Metadata) • 通用语言规范(Common Language Specification,简称CLS) • 虚拟执行系统(Virtual Execution System,简称VES) • 其他:如可移植文件(portable file)格式,通用中间语言指令集,标准编程框
通用类型系统(CTS) • 类型规范 • 任何一门CLI编程语言中提供的类型和成员都是CTS的一个子集 • C++/CLI是目前对CTS描述最为完整的高级语言
元数据 (Metadata) • 元数据是CLI组件平台的灵魂 • 元数据赋予了无限的组件管理、服务、动态能力 • C++/CLI与ISO-C++的本质区别就在于对元数据的支持
通用语言规范(CLS) • CLS是用以确保所有CLI语言能够互操作的一组规则 • 它定义了所有CLI语言都必须支持的一个最小功能集(一个CTS的子集) • 各CLI语言可以选择自己对CTS的一部分的映射,但是它至少应该支持CLS所定义的最小功能集
虚拟执行系统(VES) • VES为CLI程序提供了一个在各种可能的平台上加载和执行托管代码(即通用中间语言指令集)的虚拟机环境。 • VES实现并贯彻了CTS模型 • VES定义了一个相关的机器模型和状态、一组控制流构造,以及一个异常处理模型
Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A
何为集成? • C++/CLI支持对本地编程和托管编程的无缝集成 • 集成不是简单混合,而是对象模型的集成
最简单的集成 #include <iostream> #include <string> using namespace std; int main(){ string msg="Hello, World!"; cout<<msg; } 直接使用cl /clr 编译即可
IJW(it just works) • 绝大多数ISO-C++代码编译后将得到托管代码,即IL代码。部分不能编译为IL代码的采用P/Invoke调用实现 • 代码托管,但数据并不托管——原来ISO-C++中本地堆内的数据仍位于本地堆中
更有价值的集成 #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();} };
更深层次的集成(1) 在一个托管类中包含本地对象 ref class ManagedClass{ NativeClass nObject; };
更深层次的集成(2) 在一个本地类中包含托管对象 class NativeClass{ ManagedClass mObject; };
更深层次的集成(3) 将一个本地对象放在托管堆中 NativeClass^ nObject = gcnew NativeClass;
更深层次的集成(4) 将一个托管对象放在本地堆中 ManagedClass* pmObject = new ManagedClass;
Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A
讲座总结 • 以史为鉴,可以知兴替 • 从小处着手,建立清晰的程序观念 • 从大处着眼,建立宏观的知识体系 • 良好的ISO-C++基础很重要
Agenda • 第一个C++/CLI程序 • 栈对象语义的变化 • 通用语言基础构造CLI • ISO-C++与CLI的集成 • 讲座总结 • Q&A
资源链接 • msdn.microsoft.com/visualc • comp.lang.c++.moderated • blogs.msdn.com/slippman • pluralsight.com/blogs/hsutter • blog.joycode.com/lijianzhong • www.chinaitclub.org/forums/