博文
使用 Visual C++ 2005 的现代语言功能编写更快的代码(2)(2005-12-07 10:29:00)
摘要:Interop 选择
在 Visual Studio .NET 2003 的所有基于 .NET 框架的语言中,Visual C++ 7.1 提供了最好的 interop 功能。它具有实现实际的 interop 方案所必需的功能,Quake II 到 .NET 框架的移植便是例证,具体细节请访问http://www.vertigosoftware.com/Quake2.htm。Visual C++ 2005 进一步扩展了这一功能。
在托管与本机环境中,使用 .NET Interop 有四种主要途径:COM interop 可以使用 Runtime Callable Wrappers (RCW) 与 COM Callable Wrappers (CCW) 来实现。.通用语言运行库 (CLR) 负责类型封送(除非在极少的情况下使用自定义封送拆收器),并且这些调用的开销很大。您需要非常小心地尽量避免接口往来过于频繁,否则就会出现很严重的性能问题。您还需要保证这些包装一直与其底层的组件保持一致。也就是说,在您因简单的 Interop 场景而试图使用大量的本机 COM 代码时,COM Interop 非常有用。
第二种 Interop 选择是使用 P/Invoke。要达到此目的,可以使用 DLLImport 属性,并且在方法声明中为您想要导入的函数指定属性。封送是按照它在声明中的指定方式来处理的。然而,只有在您有代码需要通过 DLL 导出公开必需的功能时,DLLImport 才是有用的。
当您需要从本机代码调用托管代码时,CLR 宿主也是一种选择。在这种情况下,本机应用程序必须驱动所有的执行:设置主机、绑定到运行库、启动主机、检索适当的 AppDomain、设置调用上下文、查找所需的程序集和类,并调用所需类上的操作。在控制发生什么以及何时发生方面,这无疑是最健壮的解决方案之一,但这也会带来让人难以置信的枯燥,并需要许多自定义代码。
第四种选择,也有可能是最简单并最可行的选择,就是使用 C++ 的 Interop 功能。通过设置 /clr 开关,编译器会生成 MSIL 而不是本机代码。唯一被生成为本机代码的是那些无法被编译成 MSIL 的代码,其中包括带有内联 asm 块的函数,以及使用像 Streaming SIMD Extensions (SSE) 这样一些特定于 ......
使用 Visual C++ 2005 的现代语言功能编写更快的代码(1)(2005-12-07 10:28:00)
摘要:
Stephen Toub
本文基于 Microsoft Visual Studio 2005 的预发布版本,它以前的代号为“Whidbey”。此处所包含的任何信息都可能会变更。
本文讨论:
•
.NET C++/CLI 语法
•
Interop 技术
•
配置文件指导的优化
•
MSIL 优化
•
OpenMP 支持
•
增强的缓冲区安全检查
本文使用了以下技术:
Visual C++ .NET 2003 和 Visual C++ 2005
对于 C++ 语言的爱好者来说,Visual Studio .NET 2003 中 C++ 编译器的引入绝对令人垂涎欲滴。Visual C++ .NET 2003 中有 98% 的部分与 ISO C++ 标准保持一致,这使它比以往任何版本更为靠近这些标准,而且它还加入了对一些功能(如局部模板专用化)的语言支持。它还包括增强的缓冲区安全检查和改进的编译器诊断功能。C++ 开发人员就像 C# 和 Visual Basic .NET 开发人员一样,可以使用拖放窗体设计器来构建健壮的 Windows 窗体应用程序。该编译器还包含了针对 Intel Pentium 4 和 AMD Athlon 处理器的优化。
如果您对 Visual C++ .NET 2003 感到兴奋不已,您将会疯狂地爱上它的下一个版本 Visual C++ 2005。Visual C++ 2005 为 .NET开发提供了既优雅又强大的新语法支持。它使用的新优化技术已经使 Microsoft 产品的运行速度提高了 30%。它通过新的编译模式来确保 Microsoft .NET 框架通用语言基础结构(Common Language Infrastructure,CIL)的一致性和可验证性,并且具有新的 interop 模型,这不仅提供了本机和托管环境的无缝合并,而且还在跨这些边界的情况下提供了完全控制。该编译器增强了前两个版本中提供的缓冲区安全检查选项,并且还包括了 C++ 应用程序普遍使用的以安全性为中心的的库的新版本。它提供了对 OpenMP 标准以及 64 位平台(其中包括 Intel I......
软件开发入门学习的个人看法(2005-09-23 13:26:00)
摘要:踏实
偶然在网上看到《由C#风潮想起的-给初学编程者的忠告》一文. 其中一个角度:避免“浮躁”,倡导“踏实”的学习方法,我是很认同的,但总觉该文作者标题“-给初学编程者的忠告”太大,所以在其文列出的一些具体的“操作方法”上我认为可以探讨,如同自己在某次公司总结会上就《软件开发,我们积累的是什么?》为题跟同事聊了半个多小时后,其中一个同事提到希望我能继续把这个题目细化,就刚入行的他们具体该如何发展有更“具操作性”的指引,当时我是跟他们说这只是我在这一行呆了5年多的体会,谈“指引”还太远,只是可以提出来大家思考、讨论。
不要过度贬低编码
不要真的认为"不少大师级的计算机技术研究者是不懂编程的",做软件开发编码是最最基础的东西,只有踏踏实实的掌握好这个基础你才有办法往上走,不管做分析做设计做项目管理你都需要能清楚东西是如何实现的?可不可以实现?否则肯定出现大量的:"设计是设计,编码是编码","产品都是代码人员从头到尾实现的","究竟需花多少时间,难度有多大,开发人员说了算","质量/成本/进度全是黑匣子"...现象,如果你是做编码那编码就更重要了:).所以对于有志从事这个行业(软件开发)的个人来说,必须先从"重视编码"开始.过了这一关才能去考虑做系统分析,做项目管理...
软件开发的各个环节是相辅相承的,分析有分析的重要,设计有设计的重要,编码有编码的重要,测试实施也各有其地位,任何一个环节搞不好就如同我们熟悉的木桶理论,"最薄弱的一个环节制约着其总容量".
既然编码重要,那该如何学编码?
专心学好一门语言
算算自己用过的语言也不少(括弧里为使用该语言写的比较有代表性的东东),C(dos版的图像/图标编辑工具,96年的《电脑报》有介绍),C++(可自定义方块形状的方块游戏,被收录于99年《软件》杂志的附送光盘上),汇编(DOS汉字系统,97年底完成),PB(学校自动排课/排考模块,98年),ASP(一套web版的企业信息系统,99年),VB(企业信息系统的核心组件,99年),delphi(工作流平台,组件式GIS系统等),Java(De......
程序员的四境界、七宗"罪"与七武器(2005-09-03 11:56:00)
摘要:程序员的四个境界
国学大师王国维先生认为古今成大事业、大学问者,必经过三种境界,第一种境界:“昨夜西风凋碧树。独上高楼,望尽天涯路”;第二种境界:“衣带渐宽终不悔,为伊消得人憔悴”,第三种境界:“众里寻他千百度,蓦然回首,那人却在灯火阑珊处”。一代宗师真是体察入微,寥寥数语,道尽了求道者的心路历程,将一个人由浅尝、迷茫到彻悟的过程尽数概括,可谓入木三分。
IT行业可谓现在的热门行业,程序员也是很多人羡慕的工作。薪水高,不用东跑西颠,敲敲键盘,看看屏幕,一切工作全都搞定,轻松而方便。果真如此吗?不尽然,实际上,程序员的职业生涯也是一个求道的过程,需要不断的提高和学习,IT行业知识更新之快,常让程序员们有随时掉队的危险,无一日不战战兢兢,不敢稍有懈怠。
程序员的职业生涯也可分为四个阶段,初级程序员(菜鸟)、高级程序员(熟练工)、系统程序员(高手)、软件大师(大师),其作品也经历四种境界:
· 可以运行的程序
· 健壮、高效的程序
· 结构优美的程序
· 思想深邃的程序
程序员的必经第一个阶段都是编写可以运行的程序。很多人的编程生涯是从“Hello World”开始,当第一次按照教科书上的步骤,将源文件编辑完后,编译、连接、运行,在屏幕上显示出“Hello World”时,心中的激动一点也不亚于阿里巴巴打开了宝库的大门。初级程序员的目标一般是让程序能运行起来,他们迷惑于库函数的众多,不知道该用那一个,他们还要学习基本的语法,以使程序编译通过。初级程序员一般不会考虑设计模式、软件结构等问题。记得本人编写的第一个较大的程序是本人的本科毕业论文题目——一个计算机辅助实验系统,开发工具为Turbo C,在DOS下开发(那个时候Windows还不太流行,怎么样,年代够久远吧),整个软件大约7000行代码,在当时已经能干不少事,在DOS下也能显示不少花里胡哨的图形界面,支持中文,支持鼠标操作(那时候在DOS下需要自己处理鼠标事件中断),当时还颇受好评。可是今天再重新温习过去的作品,真有点掺不忍睹,整个软件毫无结构可言,一共分成两个源文件还是由于编译器不支持一个太大的源文件而被迫分开,整个系统就是源代码的简单堆砌。相信每个程序员都需要经历这个阶段,它是程序员职业生涯的开始,没有捷径可......