|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。模板 入手下手之前,先来看一个笑话,当问一个C++程序员如何完成一个给定的义务时,他(她)大概会供应一打或更多的潜伏办理计划列表,但又会极为具体地标出每种计划的成绩的地方,让你手足无措,难以选择。而VisualC++2005,经由过程C++/CLI言语联编,引进了泛型的观点,使C++程序员可进一步进步程序的开辟效力。关于.NET泛型与C++模板,只管句法上很类似,但泛型与模板是以完整分歧的办法完成的,它们之间没有任何的内置兼容性。
说到泛型与模板的不同,信任每一个.NET平台的C++程序员城市问这个成绩:我该选择哪一种手艺呢?那些已用C++举行了数年开辟(出格是用VisualC++)的人,信任早已晓得谜底:两种手艺都具有出色的特征,但任何一者都不是另外一者的超集,利用何种手艺只限于给定的义务,简而言之,没有一种手艺能够合用于一切情形下的办理计划。一样,这类进退失据的情况也熬煎了VisualC++程序员数年:Win32或是MFC、ATL或是WTL、COM或是C作风的DLL、#import或是CComPtr。
触及.NET开辟的C++常识
在已往,VisualC++使用某些手艺手腕,可以使STL中的汇合与其他手艺协同事情,如在举动模板库(ATL)中称为CComEnuOnSTL的模板化类,它同意一个VisualBasic客户端利用ForEach来列举由C++COM服务器供应的STL汇合的内容。固然这类条理上的集成十分之浅,但在很多受限情形下证明十分有效。基于一样的大旨,STL.NET为C++程序员供应了尺度STL库的一种扩大,这类扩大可同意在一个C++/CLI程序集外部利用的STL汇合,作为泛型汇合表露给其他的.NET程序集。
STL.NET供应了与尺度STL汇合不异的接口,因而,对熟习尺度STL汇合与算法的C++程序员来讲,不存在进修曲线。以VisualC++2005来作申明,STL.NET的头文件位于Cliext目次中,假如要利用STL.NET汇合,比方vector,必需包括<cliext/vector>而不是尺度的<vector>,别的,STL.NET汇合包括在cliext定名空间中,而不是尺度STL汇合所利用的std定名空间。
注:VisualC++开辟小组仍在勉力事情使STL.NET变得更容易利用,并进步它的功能。由于STL.NET仍在不休地举行新的改善,本文将不会切磋STL.NET汇合的过深的地方,而会从一种更高的角度来看,为何STL.NET将会无所作为。
桥接泛型与模板
桥接泛型与模板这两个分歧的天下,实属一项困难的义务。模板只是一个C++的观点,并只存在于编译时代;但是,泛型是一个.NET观点,它存在于已编译的程序会合,并对一切.NET言语可用。STL.NET所利用的办理计划是把类集看成C++模板类来完成,同时C++模板类也是.NET援用范例,并由实在现了ICollection泛型接口。STL与STL.NET中vector的声明演示了这类计划:
//STLvector声明
template<class_Ty,class_Ax=allocator<_Ty>>
classvector;
//STL.NETvector声明
template<typename_Value_t>
refclassvector:Generic::ICollection<_Value_t>
在这二者的声明傍边,有一些关头的分歧的地方,除泛型接口的完成以外,STL.NETvector其实不能指定一个分派算符,只是复杂地挪用gcnew来分派一个新的所需元素。STL.NET汇合声明时利用了ref关头字,这意味着它们都是.NET援用范例,将会被分派在.NET托管堆中。
<P> 利用STL.NET
撤除STL.NET汇合声明时的一些差别(这个差别与C++/CLI和尺度C++间的句法差别有关),利用STL.NET汇合与STL汇合基础上千篇一律。以下的把持台示例程序声了然一个vector工具,接着在汇合中到场了一些其他分歧范例的元素:
#include"stdafx.h"
#include<cliext/vector>
usingnamespaceSystem;
usingnamespacecliext;
intmain(array<System::String^>^args)
{
vector<Object^>^v=gcnewvector<Object^>;
v->push_back(nullptr);//第一个元素为空
v->push_back(gcnewObject());//第二个元素为一个纯工具
v->push_back(1);//第三个元素为装箱的整数
v->push_back("ElementFour");//第四个元素为字符串
return0;
}
以上代码演示了STL.NET的一个主要特性:仍然长短常熟习的汇合类,另外一个特性是,可在一个汇合中利用两种分歧的编程模子,这意味着假如要查找上述代码中的整数1,可以使用以下STLfind算法:
//看成STL汇合利用
boolcontainsOneSTL=find(v->begin(),v->end(),1)!=v->end();
别的,.NET中ICollection泛型接口也能用于完成一样的逻辑:
//看成.NET汇合利用
boolcontainsOnedotNet=v->Contains(1);
这类可在统一汇合类中同时利用STL和.NET算法的才能--而不必复制内容或供应桥接函数--同意C++/CLI程序员对任何有关汇合的操纵,选择最得当的函数与库。
有关STL.NET最初一个特性是,可为用C#或VB.NET编写的.NET程序集,无缝地供应其STL.NET汇合。因为STL.NET汇合完成了ICollection泛型接口,以是在范例平安上,再无任何消耗,再者,STL.NET汇合利用了托管内存来存储汇合中的元素,因而,在与那些供应STL.NET汇合的C++/CLI程序集互操纵时,再无任何功能或代码平安性方面的消耗。
.NET王国C++程序员的进场券
STL.NET代表了VisualC++产物的一个主要部分,其同意C++程序员使用他们现有的妙技与履历,尽早利用上带成壮大汇合与算法的类库,而不至于被疾速发展的.NET天下拒之门外。
STL.NET作为一个光亮的初步,将有助于C++在坚持言语光彩传统的同时,成为.NET言语开辟的第一类选择。其实Java之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是Java的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。 |
|