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 將各個對象分配到這個堆中 |