Post on 13-Jan-2016
description
VC++ 2005 :基础概览
讲师:李建忠 上海祝成科技 高级讲师
AgendaAgenda
• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A
Hello,World!Hello,World!
using namespace System;int main(){ String^ msg =gcnew
String("Hello, World!");Console::WriteLine(text);
}
追踪句柄追踪句柄 ^ VS. ^ VS. 指针指针 **• String^ msg; //C++/CLI 版• string * pMsg; //ISO-C++ 版
• 为什么不直接采用 ISO-C++ 指针的表示法?内容决定形式,形式反映内容——垃圾收集导致对象地址的不稳定。
gcnew VS. newgcnew VS. new
• msg=gcnew String("Hello, World!");• pMsg=new string("Hello, World!");• delete msg ? // 仅仅用来调用析构函数以释
放非托管资源,托管内存资源交由垃圾收集器负责(调用可选)
• delete pMsg // 不仅用来调用析构函数,同时也用来施放对象内存(必须调用,否则造成内存泄漏)
托管堆 托管堆 VS. VS. 本地堆本地堆• 托管堆 - 垃圾收集自动服务• 本地堆 - 程序员自己负责
• 托管堆由于垃圾收集服务的介入,影响了对象地址的稳定性,大大改变了对象模型
编译结果分析编译结果分析
• 通用中间语言( CIL )• 元数据( Metadata )• CIL 与 Metadata 都是在软件体系结构中增
加了一层间接( indirection )来实现一种抽象( abstract ),从而对系统做更高层次的演绎和拓展
AgendaAgenda
• 第一个 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++ 中,在清空栈空间时,会自动调用 M
yClass 的析构函数,并且 myObject 在栈上的空间也随之被释放
• 在 C++/CLI 中,在清空栈空间时,也会自动调用MyClass 的析构函数,但 myObject 要视 MyClass 的类型来定,如果是 value class ,那么其空间会随之被释放;如果是 ref class ,那么其在托管堆上的内存要交给垃圾收集器来处理
栈对象的地址运算栈对象的地址运算• 在 ISO-C++ 中:
MyClass* pMyObject=&myObject;(*pMyObject).MyMethod();// 解引用
• 在 C++/CLI 中:MyClass^ pMyObject=%myObject;(*pMyObject).MyMethod(); // 解引用
AgendaAgenda
• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A
CLICLI 是什么?是什么?
• CLI 全称为通用语言基础构造( Common Language Infrastructure )
• CLI 是一个虚拟机平台• CLI 同样是增加了一层间接( indirectio
n )来实现一种抽象( abstract ),它定义了一个介于操作系统和应用程序软件之间的组件平台
CLICLI 的组成部分的组成部分• 通用类型系统( Common Type System ,简称 CT
S ) • 元数据 ( Metadata)• 通用语言规范( Common Language Specificatio
n ,简称 CLS ) • 虚拟执行系统( Virtual Execution System ,简称
VES ) • 其他:如可移植文件( portable file )格式,通用
中间语言指令集,标准编程框
通用类型系统(通用类型系统( CTSCTS ))
• 类型规范•任何一门 CLI 编程语言中提供的类型和成
员都是 CTS 的一个子集 • C++/CLI 是目前对 CTS描述最为完整的高级语言
元数据 (元数据 ( Metadata)Metadata)
• 元数据是 CLI 组件平台的灵魂• 元数据赋予了无限的组件管理、服务、动态能力
• C++/CLI 与 ISO-C++ 的本质区别就在于对元数据的支持
通用语言规范(通用语言规范( CLSCLS ))
• CLS 是用以确保所有 CLI 语言能够互操作的一组规则
• 它定义了所有 CLI 语言都必须支持的一个最小功能集(一个 CTS 的子集)
•各 CLI 语言可以选择自己对 CTS 的一部分的映射,但是它至少应该支持 CLS所定义的最小功能集
虚拟执行系统(虚拟执行系统( VESVES ))
• VES 为 CLI 程序提供了一个在各种可能的平台上加载和执行托管代码(即通用中间语言指令集)的虚拟机环境。
• VES 实现并贯彻了 CTS 模型 • VES 定义了一个相关的机器模型和状态、
一组控制流构造,以及一个异常处理模型
AgendaAgenda
• 第一个 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 编译即可
IJWIJW (( it just worksit 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();}};
更深层次的集成(更深层次的集成( 11 ))
在一个托管类中包含本地对象
ref class ManagedClass{ NativeClass nObject;
};
更深层次的集成(更深层次的集成( 22 ))
在一个本地类中包含托管对象
class NativeClass{ ManagedClass mObject;
};
更深层次的集成(更深层次的集成( 33 ))
将一个本地对象放在托管堆中
NativeClass^ nObject = gcnew NativeClass;
更深层次的集成(更深层次的集成( 44 ))
将一个托管对象放在本地堆中
ManagedClass* pmObject = new ManagedClass;
AgendaAgenda
• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A
讲座总结讲座总结
• 以史为鉴,可以知兴替• 从小处着手,建立清晰的程序观念• 从大处着眼,建立宏观的知识体系•良好的 ISO-C++ 基础很重要
AgendaAgenda
• 第一个 C++/CLI 程序• 栈对象语义的变化• 通用语言基础构造 CLI • ISO-C++ 与 CLI 的集成• 讲座总结• Q&A
Q & AQ & 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/