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 _DEBUG
if (index>=used)
_asm int 3 // bad index
#endif
return array[index];
}
【字符串结尾的 '\0'】
used 的空间是包括字符串末尾的 '\0'的,但是字符串的长度是不包括这个 '\0' 的
对于字符串的赋值拼接等等操作不要忘了这个尾巴的存在哦
古代的今天是乞巧节,现在的今天是虐狗节,唉。。。。
( 请注意一下右下角的博主 Ծ‸ Ծ )