aardio 文档

aardio 范例: 动态指针

//动态指针
import console; 

/*
动态指针可以自主控制内存何时分配何时释放,在拼接字符串时速度快。
但是动态指针也比较危险。如果没有必要使用动态指针,应优先使用 buffer 或字符串等更安全的对象。
string.builder 则是基于动态指针封装的对象(支持自动释放,并增加了更多易用的接口)。

创建动态指针:
var newPointer = raw.realloc(capacity,oldPointer,initialContent)

- 参数 capacity 指定预分配大小。
- 可选用 oldPointer 参数指定原来的动态指针,传入的 oldPointer 必须弃用。
如果原来已经有数据会被保留,返回的动态指针不会清除 oldPointer 存储的数据。
- 可选用参数 initialContent 指定初始填充数据。
初始填充数据可以是字符串、buffer、结构体,或者填充到所有字节的字节码。
初始填充数据过长 aardio 会自动截断放不下去的尾部数据

动态指针会在头部倒数 8 个字节隐藏放置下面的结构体:
{  
    INT capacity;//记录预分配的内存容量  
    INT size;//记录存储的有效数据长度  
}  
并在尾部隐藏 2 个不计入长度的保护字节并放置'\u0000'。

动态指针的类型与普通指针的数据类型都是 "pointer",
aardio 无法区分一个普通指针或动态指针的数据类型,调用者必须明确而小心地区分这一点。
动态指针可以作为普通指针使用(在语言层面,它就是一个普通指针)。

raw.realloc, raw.append ,raw.sizeof 会认为传入的指针是动态指针,
如果你在这几个函数的参数里传入一个普通指针,那么程序将会出现异常。
*/

//创建动态指针
var ptr = raw.realloc(100);

//raw.sizeof 的参数可以指定动态指针、结构体、原生类型名,传入动态指针则会返回 2 个值。
var size, capacity = raw.sizeof(ptr) //size 为 0, capacity 为 100

/*
raw.append 可以识别动态指针。
参数 2 指定字符串、buffer、结构体时不用指定长度,
指定其他指针时必须用参数 3 指定长度。

此函数追加数据到 ptr 指向内存的有效数据尾部,容量不够会自动调整内存大小。
必须自返回值接收最新的动态指针,并弃用参数 1 传入的动态指针地址。
*/
ptr = raw.append(ptr,"abc") 
//raw.append 的第一个参数如果是 buffer 则返回值参数 3 指定的保留长度加上追加数据的长度

//现在 size 是 3
size, capacity = raw.sizeof(ptr) 

for(i=1;2000;1){
    //大量追加,切记总是弃用旧的 ptr 接收新的 ptr
    ptr = raw.append(ptr,tostring(i));
    ptr = raw.append(ptr," ") 
}

console.log( "存储内容长度,内存大小:",raw.sizeof(ptr) );
console.log( raw.tostring(ptr) ); //转为字符串,对于文本,因为有'\u0000'所以可自动得到长度

//指定内存大小为 0 则释放动态指针并返回 null 值
ptr = raw.realloc(0,ptr); //记住总是用返回值更新 ptr 的值。

console.pause(true);
Markdown 格式