Q: Da li bi različite varijante u varijant record-u trebale zapadati u istu memorijsku lokaciju? Prethodni Pascali koje sam koristio su ovo garantirali, i napisao sam low-level kod koji se oslanja na to. Varijante nisu iste duljine, niti je bila namjera da budu.
A: Ne, namjerno je učinjeno da diskriminante nisu preklopljene u memoriji, da bi se one mogle biti ispravno inicijalizirati prije svega. Razmotrite:
record case Boolean of False: (s1: String (42)); True: (s2: String (99)); end;
Ako bi se nizovi preklapali, posebno bi njihove diskriminante zauzimale isto mjesto u memoriji. Kako bi onda trebale biti inicijalizirane? Na bilo koji način, bilo bi krivo za barem jednu od varijanti ...
Dakle, nakon diskusije u ISO Pascal newsgroup-i gdje se ovo pitanje pojavilo u vezi s varijablama (koje također zahtijevaju nešto automatske inicijalizacije i finalizacije), odlučili smo da napravimo ovo u GPC-u za sve tipove s automatskom inicijalizacijom i finalizacijom (trenutno datoteke, objekti i sheme (schemata), uključujući i znakovne nizove, u budućnosti bi to također mogle biti i Delphi kompatibilne klase i finalizirani tipovi), budući da standard ionako ne garantira za iste da su u preklapanom memorijskom području (engl. overlay) ...
Postoje dva načina u GPC-u da se dobije garantirano preklapanje memorije (oba nestandardna, naravno, budući da standard ne pretpostavlja ništa o internim reprezentacijama; ali su oba BP-kompatibilna), absolute deklaracije i varijabilno dodjeljivanje tipova (variable type casts). Npr. da bi se preklapalo polje bajtova b sa varijablom v:
var b: array [1 .. SizeOf (v)] of Byte absolute v;
Ili možete koristiti dodjelu tipa:
type t = array [1 .. SizeOf (v)] of Byte;
nakon čega t (v) može biti korišten kao polje preklopljeno (u memoriji se nalazi na istom mjestu) sa v.