Symbian OS: 文本數(shù)據(jù)及二進(jìn)制數(shù)據(jù)的描述符介紹| 5 1. 簡介 描述符(Descriptors )是Symbian OS 的基本組成部分,它提供了對(duì)字符串進(jìn)行操作的一些 規(guī)則,同時(shí)也用作二進(jìn)制數(shù)據(jù)的容器(containers )。描述符在許多函數(shù)原型中使用,因 此,理解如何有效地使用描述符是非常重要的。 本文討論了各種描述符,范圍從基本知識(shí)到高級(jí)功能。讀者至少應(yīng)該熟悉一些基本的 Symbian OS 概念;可以參閱《Symbian 開發(fā)伙伴庫》[SYM70]中的《基本編程規(guī)范》一 節(jié)。 第二章幫助讀者理解使用傳統(tǒng)C 字符串和Symbian 描述符時(shí)遇到的一些內(nèi)存問題。第三章 通過類型的層次結(jié)構(gòu)、各類型的特點(diǎn)、字符串操作方法、字符轉(zhuǎn)換,以及一些調(diào)試問題等對(duì) 各種描述符進(jìn)行了簡要解釋。第四章給出了一些與描述符有關(guān)的APIs。第五章講述了如何用 描述符替換各種C 字符串,以便讓熟悉C 語言的程序員們能快速找到相應(yīng)的規(guī)則。 版本1.0 | 2004 年5 月28 日
Symbian OS: 文本數(shù)據(jù)及二進(jìn)制數(shù)據(jù)的描述符介紹| 6 2. 變量聲明與內(nèi)存 在本章中,程序員們可以了解到字符串聲明與內(nèi)存的關(guān)系(此信息一般也適用于變量聲 明)。各種資源受限的手持設(shè)備其內(nèi)存問題和資源管理問題至關(guān)重要。理解Symbian OS 編 程的一些基本原則對(duì)于設(shè)計(jì)出具有良好性能的軟件及其重要。 2.1 節(jié)講述了邏輯內(nèi)存區(qū)。2.2 節(jié)討論了C 字符串聲明的修正,其目的是將讀者引導(dǎo)到 Symbian 字符串聲明及其與內(nèi)存之間的關(guān)系等課題。 許多有關(guān)內(nèi)存的問題可參閱《針對(duì)移動(dòng)電話的Symbian OS C++ 》[SOSC]一書。還可參閱 《Symbian 開發(fā)伙伴庫》[SYM70]一文;讀者可以閱讀有關(guān)進(jìn)程、線程,以及內(nèi)存管理等方 面的課題。 2.1 變量與內(nèi)存 聲明變量時(shí),會(huì)在內(nèi)存中的某個(gè)地方保留其內(nèi)部數(shù)據(jù)機(jī)構(gòu)。根據(jù)這種聲明的具體情況,數(shù)據(jù) 被儲(chǔ)存到下列內(nèi)存類型之一: . 二進(jìn)制程序。編譯器對(duì)各個(gè)源程序進(jìn)行編譯,而連接器將他們連接起來。其結(jié)果 就被稱為二進(jìn)制程序。當(dāng)聲明靜態(tài)變量和常變量時(shí),其數(shù)據(jù)被包括在變量中并成 為二進(jìn)制程序的一部分。必須在程序代碼中對(duì)這類變量進(jìn)行初始化。因?yàn)樗鼈兌?br/>是常量,在程序運(yùn)行過程中并不能改動(dòng)這些數(shù)據(jù),所以也將它們作為該二進(jìn)制程 序的一部分傳遞。 既可以直接從ROM 運(yùn)行程序,也可以將其加載到只讀RAM 中,并從那里運(yùn) 行。這兩種內(nèi)存中的變量都受到保護(hù),不會(huì)被某些不適當(dāng)?shù)拇a所修改。這就是 諸如文字這類常量靜態(tài)數(shù)據(jù)被儲(chǔ)存在二進(jìn)制程序中的原因。 為二進(jìn)制程序所聲明的變量都存在于該程序的整個(gè)生命周期之中。它們不需要程 序員進(jìn)行任何內(nèi)存管理;當(dāng)程序結(jié)束時(shí),為該二進(jìn)制程序所分配的RAM 被操作 系統(tǒng)所釋放。而如果是ROM,就不必為二進(jìn)制程序作任何事情。 . 全局?jǐn)?shù)據(jù)。如果某個(gè)變量被聲明成靜態(tài)的,但并不是常量,它就被認(rèn)為是全局?jǐn)?shù) 據(jù)。在Symbian OS 中,只有可執(zhí)行的.exe 才具有全局?jǐn)?shù)據(jù)。如果為.dll 聲 明了全局?jǐn)?shù)據(jù),那么當(dāng)針對(duì)ARM 平臺(tái)編譯時(shí),編譯過程就會(huì)報(bào)錯(cuò)停止。 當(dāng).exe 被作為一個(gè)進(jìn)程而啟動(dòng)并具有全局?jǐn)?shù)據(jù)時(shí),會(huì)為全局?jǐn)?shù)據(jù)保留一個(gè)自己 的內(nèi)存區(qū)域。由于使用全局?jǐn)?shù)據(jù)通常并非好設(shè)計(jì),而且由于許多應(yīng)用都是.dll 可執(zhí)行程序,對(duì)全局?jǐn)?shù)據(jù)的使用不在本文中講解。 . 棧。Symbian OS 中的每個(gè)線程都有其自己的棧。自動(dòng)化變量被分配到該棧中。 當(dāng)調(diào)用某個(gè)方法時(shí),其參數(shù)也被分配到這個(gè)棧中。因?yàn)闂3叽绾苡邢蓿▽?duì)于 Symbian OS 更是如此),只有一小部分的數(shù)據(jù)可以被分配到這個(gè)棧中。在函數(shù) 調(diào)用中,必須使用對(duì)象的指針或引用,以降低將這些對(duì)象副本分配到棧中的需 求。 由于規(guī)定了棧中變量的生命周期,所以當(dāng)該程序塊結(jié)束時(shí),該程序塊中全部已被 聲明的自動(dòng)化變量都會(huì)被自動(dòng)刪除。如果該變量是一個(gè)類,它有一個(gè)析構(gòu)函數(shù), 那么在將該對(duì)象移出棧之前就會(huì)先調(diào)用這個(gè)析構(gòu)函數(shù)。 . 堆。Symbian OS 中的每個(gè)線程都有一個(gè)堆。這是一個(gè)內(nèi)存區(qū)域,其中放置所有 被動(dòng)態(tài)分配的對(duì)象。用對(duì)象C++ 的關(guān)鍵字new 將各個(gè)對(duì)象分配到這個(gè)堆中 |