在栈空间敏感的环境中应谨慎使用TRAP()

最近在优化一个函数的栈使用中,意外的发现以前一直被忽略的一个消耗源,那就是TRAP()宏。作为Symbian编程基石之一的TRAP/Leave在已经被很多人当作C++的try{throw}catch一样使用的时候,你是否意识到这个宏会消耗多达76字节的栈空间?如果使用的是TRAPD()版本,则这个数字将达到80字节。倘若函数中用了不止一次的话,栈消耗将相当可观。

除了认真审视函数上下文中是否有使用TRAP()的必要(有些时候直接往上传递Leave也未尝不可), 可能更多的时候是难以避免使用TRAP()的,那么如何才能尽量节省栈空间呢?这里有一个简单的方法,那就是把TRAP()宏拆开来,在一个函数内使用共享的TTrap对象。

如果你也被Symbian那点可怜的栈空间困扰,不妨也关注一下程序中TRAP()/TRAPD()的使用吧。

当PC-Lint遇上Symbian

PC-Lint是一款强大的C/C++程序检查工具,毫不夸张地说,如果编译器能为你发现20%的程序缺陷,那么PC-Lint至少还能为你发现余下的65%。(最后15%还是留给你自己去排查吧,机器始终是无法取代人脑的~)

可是,当PC-Lint遇上Symbian,就像那法力无边的如来佛遇上了刁钻难缠的孙悟空,也常常拿它没有办法。如今咱可是和谐社会了,怎么说也不能一怒之下就将孙猴儿打下五指山,落的个百年不得翻身吧。为了让两位大爷和平共处,我这观世音也只好费力的来调解调解了。

首先,在下面的地址取得Symbian官方提供的Lint配置文件:
http://www.symbian.com/developer/techlib/v9.2docs/doc_source/faqsdk/faq_0449.html
(如果官方的链接无法下载,请[点击这里]下载其副本)

借助官方的配置文件,PC-Lint已经能够识别大部分的Symbian程序代码。但实践中遇到的一些Lint提示仍然是这份97年之后再也没更新过的配置文件所能应付的。在这里,我补充一些自己总结的额外规则,提供给大家参考:

-D_UNICODE

-e1774			// Disable dynamic_cast
-emacro(717, *)		// Ignore do{...} while(0) in macros
-emacro(???, _LIT)
-emacro(???, _L)
-function( exit, User::Leave, User::LeaveNoMemory )
-function( __assert, User::LeaveIfError )

至于TRAP/TRAPD所产生的“Warning 655”,始终未能找到有效的消除方法。(当然,最坏的情况下你也可以加上括号以迁就PC-Lint的智商……)