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


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 
string& 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	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' 的

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




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

Irrlicht 源码学习笔记 【irrstring.h】_第1张图片

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


你可能感兴趣的:(Irrlicht)