Kielekezi
Mfano wa Aina ya Kumbukumbu Huria ya Wave
Muundo wa pointer wa Wave unategemea Mfano wa Aina ya Kumbukumbu Huria ya Wave. Mfano huu unalenga kufafanua pointers na safu kama aina za kumbukumbu zilizo wazi katika kiwango cha lugha, badala ya ujanja wa kisarufi au utando wa maktaba.
Kulingana na muundo huu, ndani ya Wave, pointer inaonyeshwa kama aina ya ptr<T>, na hii inaonyesha wazi aina inayomaanisha anuani ya kumbukumbu inayohifadhi thamani maalumu ya aina T.
Njia hii inachukua pointers kama sehemu ya mfumo wa aina badala ya waendeshaji au sarufi ya tamko,
ikiruhusu muundo wa kumbukumbu kuwakilishwa kwa njia ya angavu zaidi na thabiti.
Katika Wave, pointer ni aina wazi ya ptr<T>.
Upatikanaji wa anwani unatumia &, na rejeleo la kinyume linatumia deref.
Taarifa na Uanzilishaji
var x: i32 = 10;
var p: ptr<i32> = &x;
Aina za pointer zinaweza kutundikwa.
var p1: ptr<i32> = &x;
var p2: ptr<ptr<i32>> = &p1;
Kurejelea
var x: i32 = 10;
var p: ptr<i32> = &x;
println("{}", deref p); // 10
deref p = 20;
println("{}", x); // 20
Sheria ya null halisi
null ni liteta rasmi. Sio kitambulisho na haiwezi kutumiwa kama jina la kigezo.
Sheria ya msingi:
nullinaweza tu kupewa kwa shabaha yaptr<T>.- Haiwezi kutolewa kwa aina za zisizo kuwa za pointer kama
i32,bool,array<...>. - Haiwezekani kuanzisha pointer kutumia herufi za nambari (
0,123,-1, nk). Tumianullwazi.
var p: ptr<i32> = null;
var arrp: ptr<array<i32, 3>> = null;
// var n: i32 = null; // ERROR
// var b: bool = null; // ERROR
Hesabu ya Pointer
Wave inaunga mkono hesabu zifuatazo za pointer.
ptr + int: Pointer ya GEP mbeleint + ptr: Kitendo sawaptr - int: Pointer ya GEP nyumaptr - ptr: Hesabu ya tofauti ya byte yai64
Kidokezo:
ptr<T> +/- ninahama kwa misingi ya ukubwa waT(sizeof(T)).- Hii inamaanisha
ptr<i32> + 3inahama kwa+12kutegemea bayti.
var base: ptr<i32> = 0x1000 as ptr<i32>;
var p1: ptr<i32> = base + 3; // 0x1000 + 12
var p2: ptr<i32> = 2 + base; // 0x1000 + 8
var p3: ptr<i32> = base - 1; // 0x1000 - 4
var diff: i64 = p1 - base; // 12 (byte diff)
Ulinganisho wa Pointer
Pointers zinaweza kutumiwa kulinganisha.
if (p == null) { ... }
if (p != null) { ... }
if (p1 == p2) { ... }
Uhusiano na safu
Safu za pointer:
var a: i32 = 10;
var b: i32 = 20;
var arr: array<ptr<i32>, 2> = [&a, &b];
println("{} {}", deref arr[0], deref arr[1]);
Pointer ya safu:
var p: ptr<array<i32, 3>> = &[1, 2, 3];
if (p != null) {
println("{}", deref p[1]);
}
Kumbuka ya Usalama
Hivi sasa, Wave si mfano wa usalama wa pointer wa msingi wa umiliki/maisha kama Rust.
Kwa hivyo, hairuhusu kiotomati urejelezaji wa null. Inashauriwa kutumia njia ya kuingiza cheki ya null kabla ya deref.
