Symbian 是Nokia,爱立信等高端PDA手机中常用的一个操作系统, 原生的SDK是C++, 所有的API都是直接使用C++语法, 当然为了兼容的原因, 仍然提供了标准C library, 不过功能并不完善, 在symbian中也不推荐使用, 不过我觉得用也无妨,, 因为C的接口比较简单.

Symbian是一个比较陈旧的操作系统, 使用C++开发的时间大概在90年代早期, 基本上没有用到什么高深的C++特性, 例如STL等, 当时C++编译器也没有现在这么高级. 现在看, 我个人认为Symbian是一款较差的融合了C/C++/Java等各种语言的缺点,( 当然当时还没有Java), 而组合成的一个预计在未来不超过10年的时间需要被进行大幅度整改的基于C++的操作系统, 其中它对C++语义的无情摧残和丑陋的Leave机制, 基本上使得在Symbian上开发C++完全就像在走钢丝, 使得C++语言中提供的一个及其重要的特性"确定性析构" 无法在Symbian上得到保证.

没有确定性析构, 就没有RAII, Symbian中没有异常, 因此就使用了一种类似C中longjmp的机制, 由于longjmp并不自动进行stack unwind, 因此Symbian提供了Cleanup Stack, 要求程序员手工将执行析构动作的函数指针填入一个Stack列表中, 当longjmp(leave)的时候, 会一一调用在这个Stack中的函数, 以释放资源.

基本上来说, 对比现在的C++异常, Leave机制基本上没有提供任何比C++异常好的地方, 无论是效率还是内存消耗, 而且Leave机制具有错误倾向. 毕竟这些事情人还是不如编译器.

Symbian为了满足它的Leave机制, 提供了几个T,C,R,M class类别.

C class:
   所有原本具有non-trivial构造函数的class按照Symbian的定义, 都应该是一个C class. 需要采用两阶段构造, 先new一块内存, 然后在构造函数中不能再进行任何内存分配等任何可能引发Leave的函数, 也就是保证ctor必须成功, 然后在提供另外一个函数在进行必要的初始化, 这个在Symbian中一般命名为ConstructL. 为了避免程序员不小心漏过ConstructL, 因此一般这个构造函数都不是public, 而提供一个静态的NewL或者NewLC静态工厂函数返回新创建的对象的指针. 如下:
   class CFoo
   {
   public:
     static CFoo* NewL();
     ~CFoo();
   protected:
     CFoo();
     void ConstructL();
   };

得到这个指针以后, 为了实现Leave完全( symbian SDK中的不少函数内部都是Leave的) , 因此必须对这个裸指针进行保护. auto_ptr? 别做梦了, 前面说来Leave机制发生的时候没有确定性析构. 因此需要将这个对象手动插入到Stack中,  见#1

CFoo * foo = CFoo::NewL();
  CleanupStack::PushL(foo);         #1
 
  do_sth(..);
 
  CleanupStack::PopAndDestroy(1);   #2

还要写一个#2, 调用foo的析构函数.

而由于PushL需要调用Foo的析构函数, 因此这个Foo应该继承自一个基类, 以使得析构函数为virtual. Symbian提供了一个class用于被所有的C class继承, 即CBase. 因此我们的CFoo 就应该从CBase继承.

对比有C++ Exception的实现, 程序员可以:
 CFoo foo;
 do_sth(..);

对比上面使用Leave机制的例子, 哪个好一目了然.

由于C class的特性, 决定了Symbian中很难使用多重实现继承, 这个并不是太大问题. 但是要求所有的C Class都必须分配在Heap中, 就有点类似"纯OO"Java的味道了, 但是又没有GC可用, 因此大量的登记工作就全留给程序员了. 而且从Heap中分配和从Stack中分配速度相差不少.

又如果你一个大的C class包含有2个其他的C class作为成员变量, 对了, 那也是你最爽的一种.
这两个C class对象也必须使用New的方式创建出来. 也就是C++中的Pimpl手法.

R class 同样, 还是类似 "纯OO"的Java, 提供一个Close()函数释放资源, 基本上都是C++中最难用的方法.

还有一点就是Symbian中的DLL不能有data段, 也就是没有静态数据. 没有静态数据连个singleton都实现不了, 更别提其他的用处了.Symbian的大概解释是: 一个DLL如果有静态数据, 那么对于每个调用了这个DLL的Process都需要分配一个内存块, 最小的单位是4K. 因此如果一个DLL被N个进程使用, 那么即使只有一个字节的静态数据, 浪费的大小也是 N * 4K, 因此不可接受.

明智之举!!

我写的DLL从来就是我自己公司的一个破烂程序使用, 别人根本就不调用我的DLL, 因此根本没有N个进程, 因此也就浪费4K. 而且我程序越大, 需要的静态数据就越大, 因此4K最小分配单位根本就不是一个问题.

系统的DLL可是被很多进程调用的啊? 这个开销可不少啊. 对啊, 但是系统的DLL又不是我写的, 是你们这些绝顶聪明之人所为, 你可以不用啊. 为什么要限制我们使用了?

还有一本中文版的Symbian的书好像说到一点: Symbian的这些genius为了防止我们这些傻瓜们滥用静态数据,  因此干脆就去除了这个特性.

这个解释我最喜欢, 也觉得最合理, 符合C/C++的传统精神: 程序员都是傻瓜.

我喜欢Symbian!!

我喜欢Symbian相关推荐

  1. S60v5 编程环境的搭建(2)

    以前自己也尝试过在搭建Windows XP下搭建Symbian S60v5系统的编程环境.(那一次也是花了不少气力~~~)怎么说呢,其繁琐的安装过程,缓慢的模拟器,十分不熟悉的IDE环境,都让人很不舒 ...

  2. 诺基亚Symbian算不算智能手机?

    (1)智能手机 诺基亚的第一款智能手机是2001年上市的诺基亚9210.我用的第一款智能手机是2003年买的摩托罗拉的E680,有触摸屏.大屏幕.Linux操作系统.可编程. 我2006年特羡慕多普达 ...

  3. symbian学习转载

    [虎.无名]学习Blog 诺盛电信咨询:移动支付是什么- -| 回首页 | 2006年索引 | - -Nokia 6681菜鸟必修课 zt 腾达智能社区:Symbian基础类知识- - http:// ...

  4. Symbian OS on E65应用开发手记(3)——SDK注册及14天学习总结

    在环境搭建完成14天以后,今儿竟然神奇地提示我SDK已过期,需要注册--真吓人,你干吗我刚安装完的时候不提示我注册啊?折腾我!!!还以为我会从此找不到序列号,从此用不了了呢... 注册方法如下: 在对 ...

  5. Symbian日薄西山了么

      当初对着IPHONE与NOKIA X700,安卓还是塞班,这是个问题...最终选了X700.众人都说它将被淘汰,但同时意味着它的成熟.     塞班真的有致命不可突破的缺陷么?真的失去了持续开发的 ...

  6. Symbian知识汇集

    1,Symbian命名法 1) 基本类型      TIntX 和 TUintX (其中X = 8, 16 和 32) 分别用来表示 8位, 16位 和 32位的有符号和无符号的整数. 一般情况下,使 ...

  7. 智能手机系统Windows mobile和Symbian的选择

    智能手机系统Windows mobile和Symbian的选择 若说到智能手机,不能不谈到操作系统--   所谓智能手机(Smartphone),是指"像个人电脑一样,具有独立的操作系统,可 ...

  8. Symbian 开发知识

    找资料的时候发现这个不错就转过来啦 Symbian 开发知识,琐碎篇 General Hints / 一般提示 学习S2,我的方法无非是: ·每天coding,多少小时你自己掌握,看你有多少时间了. ...

  9. 新的Symbian OS 9 可执行文件格式(E32Image)

    新的Symbian OS 9 可执行文件格式(E32Image) 翻译:加百力(看雪论坛 嵌入式平台安全 版主) Symbian已经发布了Symbian OS 9.在这个新版中引入了很多新的特性和改变 ...

最新文章

  1. ASP.NET MVC – 视图简介
  2. 从上千篇论文脱颖而出,支付宝论文凭什么获得WWW2020评委认可?
  3. 20135223何伟钦—信息安全系统设计基础第七周学习总结
  4. 专家答疑:在ERP系统中确保销售订单准确性
  5. Python Map, Filter and Reduce
  6. 95-190-742-源码-WindowFunction-AllWindowFunction
  7. 从 dig(nslookup) bind —— windows 下的域名解析服务器信息的查看
  8. python脚本实现ipv6的ddns功能
  9. F - XOR Equation CodeForces - 635C (数学)
  10. ABAQUS常用量纲
  11. Netty 是什么,Netty原理详解
  12. 利用python搭建socket server服务器
  13. ANSYS入门——模态分析步骤与实例详解
  14. Win7 中使用 blat 自动发邮件
  15. 思科3650交换机的密码恢复
  16. movieclip_Flash脚本-在Flash中更改Movieclip的颜色
  17. Restful API 接口规范
  18. 我炒股十几年了,随着股龄的增长,对股市的操作也越来越得心应手。现在,股票年年都能赢利
  19. 山东大学软件质量保证与测试技术复习纲要
  20. CSDN文章编辑技巧

热门文章

  1. Service Intent must be explicit: Intent 解决
  2. 阿里云孙成浩:生而为云,连接增长——洛神云网络3.0持续演进
  3. Vue中防止误点弹窗阻断
  4. 《杀破狼·贪狼》剧情在线观看
  5. 建站案例 | 巧用科技蓝,打造有个性、高颜值的企业官网
  6. 几种主流前端软件包管理工具
  7. 病毒四度升级:安天AVL Team揭露一例跨期两年的电信诈骗进化史
  8. 扫地机器人作文列数字举例子_扫地机器人作文500字全面版
  9. vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode
  10. 毕业设计-基于机器视觉的路面裂缝检测装置-OpenCV