Symbian OS: 文本数据及二进制数据的描述符介绍| 5 1. 简介 描述符(Descriptors )是Symbian OS 的基本组成部分,它提供了对字符串进行操作的一些 规则,同时也用作二进制数据的容器(containers )。描述符在许多函数原型中使用,因 此,理解如何有效地使用描述符是非常重要的。 本文讨论了各种描述符,范围从基本知识到高级功能。读者至少应该熟悉一些基本的 Symbian OS 概念;可以参阅《Symbian 开发伙伴库》[SYM70]中的《基本编程规范》一 节。 第二章帮助读者理解使用传统C 字符串和Symbian 描述符时遇到的一些内存问题。第三章 通过类型的层次结构、各类型的特点、字符串操作方法、字符转换,以及一些调试问题等对 各种描述符进行了简要解释。第四章给出了一些与描述符有关的APIs。第五章讲述了如何用 描述符替换各种C 字符串,以便让熟悉C 语言的程序员们能快速找到相应的规则。 版本1.0 | 2004 年5 月28 日
Symbian OS: 文本数据及二进制数据的描述符介绍| 6 2. 变量声明与内存 在本章中,程序员们可以了解到字符串声明与内存的关系(此信息一般也适用于变量声 明)。各种资源受限的手持设备其内存问题和资源管理问题至关重要。理解Symbian OS 编 程的一些基本原则对于设计出具有良好性能的软件及其重要。 2.1 节讲述了逻辑内存区。2.2 节讨论了C 字符串声明的修正,其目的是将读者引导到 Symbian 字符串声明及其与内存之间的关系等课题。 许多有关内存的问题可参阅《针对移动电话的Symbian OS C++ 》[SOSC]一书。还可参阅 《Symbian 开发伙伴库》[SYM70]一文;读者可以阅读有关进程、线程,以及内存管理等方 面的课题。 2.1 变量与内存 声明变量时,会在内存中的某个地方保留其内部数据机构。根据这种声明的具体情况,数据 被储存到下列内存类型之一: . 二进制程序。编译器对各个源程序进行编译,而连接器将他们连接起来。其结果 就被称为二进制程序。当声明静态变量和常变量时,其数据被包括在变量中并成 为二进制程序的一部分。必须在程序代码中对这类变量进行初始化。因为它们都 是常量,在程序运行过程中并不能改动这些数据,所以也将它们作为该二进制程 序的一部分传递。 既可以直接从ROM 运行程序,也可以将其加载到只读RAM 中,并从那里运 行。这两种内存中的变量都受到保护,不会被某些不适当的代码所修改。这就是 诸如文字这类常量静态数据被储存在二进制程序中的原因。 为二进制程序所声明的变量都存在于该程序的整个生命周期之中。它们不需要程 序员进行任何内存管理;当程序结束时,为该二进制程序所分配的RAM 被操作 系统所释放。而如果是ROM,就不必为二进制程序作任何事情。 . 全局数据。如果某个变量被声明成静态的,但并不是常量,它就被认为是全局数 据。在Symbian OS 中,只有可执行的.exe 才具有全局数据。如果为.dll 声 明了全局数据,那么当针对ARM 平台编译时,编译过程就会报错停止。 当.exe 被作为一个进程而启动并具有全局数据时,会为全局数据保留一个自己 的内存区域。由于使用全局数据通常并非好设计,而且由于许多应用都是.dll 可执行程序,对全局数据的使用不在本文中讲解。 . 栈。Symbian OS 中的每个线程都有其自己的栈。自动化变量被分配到该栈中。 当调用某个方法时,其参数也被分配到这个栈中。因为栈尺寸很有限(对于 Symbian OS 更是如此),只有一小部分的数据可以被分配到这个栈中。在函数 调用中,必须使用对象的指针或引用,以降低将这些对象副本分配到栈中的需 求。 由于规定了栈中变量的生命周期,所以当该程序块结束时,该程序块中全部已被 声明的自动化变量都会被自动删除。如果该变量是一个类,它有一个析构函数, 那么在将该对象移出栈之前就会先调用这个析构函数。 . 堆。Symbian OS 中的每个线程都有一个堆。这是一个内存区域,其中放置所有 被动态分配的对象。用对象C++ 的关键字new 将各个对象分配到这个堆中 |