aardio 文档

aardio 范例: 静态内存结构体

//静态内存结构体
//相关范例:调用其他语言 > C 语言 > 静态内存结构体
import console.int; 
import raw.struct;

/*
创建静态内存结构体类型,也可以在第 2 个参数中指定内存指针
*/
var floatArray = raw.struct({
    float v[500] 
})

/*
aardio 结构体在与原生 API 交互时动态分配内存指针。
但『静态内存结构体』可以分配固定不变的内存指针,调用原生 API 时不需要再动态分配内存。
在 aardio 中读写静态内存结构体的直接成员(不包含成员的成员)会更慢。

静态内存结构体可直接传入其他线程使用,传入其他线程后指针地址也不会变动。
静态内存结构体的生命周期也由创建该静态内存结构体的线程维护,其他调用线程不检查指针有效性。
多线程可同时读写静态内存结构体,如果有必要请自行调用 thread.lock 添加线程锁。
*/ 
thread.invokeAndWait( 
    function(floatArray){
        /*
        注意创建floatArray的线程负责维护该对象的生命周期,
        使用floatArray的线程不会维护或检查内存指针是否有效。
        */
        floatArray.v = {
            //这种方式修改静态内存结构体,必须覆盖成员字段 floatArray.v[1] = 456 这样写是错的。
            456,2,3
        } 

        /*
        如果该结构体的首个成员是数组,
        也可以直接使用索引读写该数组的成员,
        这时候是直接移动指针到索引指定的内存,速度更快
        */
        floatArray[2] = 789.1

        //也可以用 set 函数一次性更新结构体,这样避免多次与原生内存同步数据
        floatArray.set({
            v = {991,992,993}
        })
    },floatArray //可以直接传入线程使用
)

/*
不建议直接用 floatArray.v[1] 这种写法,这会导致不必要的内存同步操作。
我们可以调用 get 函数将结构体的值复制为普通结构体,这样读写就快了。
*/ 
var array = floatArray.get()

console.log("主线程获取静态内存结构体的值" ,array.v[2] );

/*
如果该结构体的首个成员是数组,
也可以直接使用索引读写该数组的成员,
这时候是直接移动指针到索引指定的内存,相对会好快一些。
*/
console.log("主线程获取静态内存结构体的值" ,floatArray[3] );

Markdown 格式