Irrlicht 源码学习笔记 【irrstring.h】

来源:互联网 发布:部落冲突猪升级数据 编辑:程序博客网 时间:2024/05/29 07:00


Irrlicht 中自己实现了一个字符串类

实现了一个字符串的模板,使用这个模板可以很容易定义出 ascii 字符串和 unicode 字符串

该类的实现相对简单,没有用到类似于 stl 中 string 的 copy-on-write 这些东西



字符串中私有成员变量有三个,分别是:

记录内存空间的指针 - array

申请的内存空间可以存储元素的个数 - allocated

空间中已经存储的元素个数 - used

(因为是模板,所以每一个 T 的空间是一个元素)



【关于赋值运算】

这里有一点需要注意的地方就是关于赋值运算符

假如当前要把字符串 B 赋给字符串 A,记得要考虑字符串 B 是字符串 A 的一部分时的情况

如果上来就直接把 A 的空间 delete 了的话就出问题了

所以 Irrlicht 中的做法是先保留 A 的空间,申请新的空间来赋值,赋值完毕再删除原来 A 的空间

这个也是博主之前会犯的错误。。。

//! Assignment operator for strings, ascii and unicode (给ascii编码和unicode编码的赋值语句)// 注 : 如果c是null, 会将0号元素设置为0, 但是没有对used进行设置template <class B>string<T>& operator=(const B* c) {if (!c){array[0] = 0x0;return *this;}if ((void*)c == (void*)array)return *this;s32 len = 0;const B* p = c;while(*p){++len;++p;}// 原始的字符串会先保留一段时间// 因为传入的字符串可能是原始字符串的一部分 ( 不得不佩服Irrlicht程序员考虑问题的周到! )T* oldArray = array;        allocated = used = len+1;array = new T[used];for (s32 l = 0; l<len+1; ++l)array[l] = (T)c[l];delete [] oldArray;return *this;}



【_asm int 3】

在 Irrlicht 源码中多个地方使用到了内嵌的汇编语句 _asm int 3

而且都在前面加了 #ifdef _DEBUG 的预处理

意为:在 DEBUG 下满足某个条件时即触发断点, int 3 是汇编中的断点中断指令

//! Direct access operator (直接通过[]获取字符串中对应下标的字符)T& operator [](const s32 index)  const{// _asm int 3 是使用汇编中的断点中断指令// 意为在DEBUG模式下, 如果下标越界则触发断点#ifdef _DEBUGif (index>=used)_asm int 3 // bad index#endifreturn array[index];}





【字符串结尾的 '\0'】

used 的空间是包括字符串末尾的 '\0'的,但是字符串的长度是不包括这个 '\0' 的

对于字符串的赋值拼接等等操作不要忘了这个尾巴的存在哦




古代的今天是乞巧节,现在的今天是虐狗节,唉。。。。 


(  请注意一下右下角的博主 Ծ‸ Ծ   )