看以下例子:
template<class T>
class MyArray
{
public:
T* _pData = null; //指针,指向第一个元素
size_t _nElementCount = 0; //无素个数
public:
MyArray(const T* pt, const int nLen) { }
size_t length() const { return _nElementCount; }
static _ByteArray pkg_to_memory(const MyArray<char>& arr) {
_ByteArray b;
b.add(b.length()); //第一步写入数据长度,自动判断 length()类型
b.add((_byte*)arr._pData, b.length()); //写入数据
return b;
}
static MyArray split_from_memory(_ByteArray& ba) {
MyArray<char> arr;
//第一步读取数组长度,根据最初定义的是int
//读取一个int,指针向后移动sizoef(int)
int n = ba.readNext<int>();
//............... //读取数据
return MyArray<char>(ba.data(), n);
}
};
嗯,这个程序运行了几个月,甚至几年,有一天,其中有好几个应用用pkg_to_memory打包了很多的数据,完全没问题。但是,后来为了兼容性,你改了程序,把int改为size_t:

你甚至根本都没有注重到 pkg_to_memory和split_from_memory这两个函数,但是:


现在是写入size_t 读取是int,在一段时间后,在另外几个程序中,你发觉程序保存数据后再打开会读取错误,崩溃了,检查N天后发现是把int 改成了size_t,然后马上又改成:

现在新的文件读取正常,老文件又崩溃了。因为老的文件是写入是int,读取是size_t,像下面这样:

结论:在你编写的所有自定类或者容器中,最好统一用size_t 。
况且int还有一个缺点,最大值:2147483647,如果是char或
byte,它最大支持为2G的文件(2,147,483,648 字节 = 2,048
MB = 2 GB)。
因为你的容器所能表示的最大长度是:2147483647。