|
一、描述符存储方式
在Symbain OS中,用描述符(Descriptor)来实现字符串,之所以这么做,其问题还是在于内存的使用,通常设备上只有20M 的 ROM 和 8M 到 16M 的 RAM,而且 RAM 还有被用于各种用途:RAM 被 MMU 管理,分成4k大小的页面,分别要要存放内核、各种用户进程、C盘映射区、DLL等。看来内存真的是宝贵透了!
描述符在内存中的存储形式有三种:
1、直接存放在二进制代码中。也就是在写程序的时候已经把字符串写在程序中了,如
那么这时,这个描述符就被存放在程序的二进制代码中了.
2、存放在栈(Stack)中。这种类型的对象称为自动对象。对于存放在栈上的对象应该把握一个基本的原则,那就是不要太大,而且在栈上适合放一些大小固定的对象。那么对于描述符来说,如果我希望把它存放在栈中,那么我我希望这个描述符的大小在以后程序运行过程中大小是不变的,而且希望它的生存期和使用它的函数一致。因为在Symbain 中使用内存总是要尽快的释放内存。
3、存放在堆(Heap)中。如果对象是存放在堆中的,那么当对象需要更多的内存时,可以从当前线程的默认堆中分配。在堆中的对象也称为动态对象。有些字符串不可以放在栈里面,因为他们太大了,比如说,一个大于最大文件名长度(255个字符)的描述符就不适合放在栈里面,所以他们只好放到堆里面。如果你要对描述符进行操作,那么也最好放在堆里面,当操作要求描述符增长的时候,描述符就可以动态地从堆获得内存。
二、描述符的窄生成和宽生成
窄生成和宽生成主要和Unicode有关.描述符为了支持Unicode,就需要使用宽生成。查看SDK文档的TDesC类,他是描述符的基类,它的定义是:
#if defined(_UNICODE) typedef TDesC16 TDesC; #else typedef TDesC8 TDesC; #endif |
这里使用了_UNICODE宏来控制生成模式。所以在实际的使用中,描述符的基类应该是TDesC8或者是TDesC16.
三、静态结构
如图:这个图是从 NewLC.com 获得的:
这是描述符号存储的简单例子:
void Descriptor() { // KBcode 是一个TLit常量,它位于二进制代码中 _LIT(KBCodeDesc,"LeeFJ\n"); console->Printf(KBCodeDesc);
// 获得一个TPtrC类型的描述符, // tptrc2cun存放在栈中,它指向了KBCodeDesc TPtrC tptrc2(KBCodeDesc); console->Printf(tptrc2);
// TPtrC 是一个两个字大小的对象,包含一个指针和一个长度。 TPtrC tptrc1=_L("LeeFJ2\n"); console->Printf(tptrc1);
TPtrC tptrc3; tptrc3.Set(KBCodeDesc); console->Printf(tptrc3);
// TDesC 类型引用,建议在接口中使用抽象类。 TDesC tdesc=_L("LeeFJ\n"); TInt len=tdesc.Length(); console->Printf(_L("len=%d\n"),len);
// 在栈上建立缓冲区,把描述符本身放入栈中 TBufC<7> BUFStr(KBCodeDesc); console->Printf(BUFStr);
// 两种不同的方法在堆上获得描述符存储 HBufC* Hbuf1=HBufC::NewLC(10);
HBufC* Hbuf2=KBCodeDesc().AllocL(); } |
|