Autor Téma: Pointer Math vs. XE2 x64  (Přečteno 1702 krát)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1499
  • Karma: 37
    • Pepak.net
Pointer Math vs. XE2 x64
« kdy: 04-07-2012, 07:50:50 »
V 64 bitech už nejde používat tradiční pointerová matematika:
Kód: Delphi [Vybrat]
  1. P := Pointer(Integer(P) + 123);
protože velikost pointeru je jiná než velikost integeru a přetypováním P na integer by došlo k oříznutí horních 32 bitů. Jako náhrada se všude možně doporučuje zápis:
Kód: Delphi [Vybrat]
  1. {$POINTERMATH ON}
  2. P := PByte(P) + 123;
  3. {$POINTERMATH OFF}
Otázka zní, proč? Je sice hezké, že to v XE2 funguje, ale zase to nefunguje v ničem menším než v D2009. Je nějaký zásadní důvod, proč neadaptovat původní řešení na:
Kód: Delphi [Vybrat]
  1. P := Pointer(NativeUInt(P) + 123);
což bude kompatibilní klidně i s Delphi 1, když na to přijde? Pouze musím nadefinovat typ NativeUInt, např. pomocí:
Kód: Delphi [Vybrat]
  1. {$INCLUDE 'jedi.inc'}
  2. {$IFNDEF DELPHIXE2_UP}
  3. type
  4.   NativeUInt = {$IFDEF DELPHI1} Word {$ELSE} LongWord {$ENDIF} ;
  5. {$ENDIF}
Nebo vůbec použít ještě tradičnější:
Kód: Delphi [Vybrat]
  1. Inc(P, 123); // predpoklad: P je ukazatel na jednobajtovy typ, napr. AnsiChar nebo Byte
Proč je všeobecně doporučována přímá pointerová aritmetika?
« Poslední změna: 04-07-2012, 07:53:42 od pepak »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2666
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Pointer Math vs. XE2 x64
« Odpověď #1 kdy: 04-07-2012, 10:41:44 »
Myslím si, že se snaží minimalizovat použití pointerů pro velmi blízkou budoucnost (nový kompilátor pro ARM). Ale to je jen můj názor.

Jinak NativeInt je správně deklarován od symbolu UNICODE a já používám toto (bez Delphi 1):

Kód: Delphi [Vybrat]
  1. {$IFDEF UNICODE}
  2.   IntPtr = NativeInt;
  3. {$ELSE}
  4.   IntPtr = Integer;
  5. {$ENDIF}
  6.  


« Poslední změna: 04-07-2012, 10:43:41 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1499
  • Karma: 37
    • Pepak.net
Re:Pointer Math vs. XE2 x64
« Odpověď #2 kdy: 04-07-2012, 19:58:03 »
Myslím si, že se snaží minimalizovat použití pointerů pro velmi blízkou budoucnost (nový kompilátor pro ARM). Ale to je jen můj názor.
To nedává smysl. Pomiňme teď skutečnost, že (ne)použitelnost pointerů je téměř výhradně doménou jazyka, ne procesoru (téměř každý existující procesor pointery v nějaké jejich podobě používá). Pokud by však Embarcadero chtělo pointery redukovat, tak sotva bude postupovat tak, že místo jednoho zápisu zavede jiný, který dělá prakticky totéž.

Moje otázka je směrovaná spíš na to, proč je doporučovaný zrovna tenhle způsob práce s pointery a ne nějaký jiný. Přece když něco doporučuju, tak to musí mít důvod; v případě úplně nové vlastnosti by ten důvod klidně mohl být "protože se mi to líbí takhle", ale pokud se doporučený způsob použití mění u něčeho, co už používáme desítky let nějak jinak, tak to přece chce rozumnější zdůvodnění... (I když mě napadá, že to možná bude paralela se zavedením metod pro recordy a co možná největší zatajení objectů, které také podle všeho nemá žádný rozumný důvod, jenom ten, že se to tak Embarcaderu líbí. Takže třeba nová pointerová aritmetika také nemá jiný důvod, než aby Embarcadero čas od času programátorům otřáslo jejich světem, aby příliš nezlenivěli...).

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2666
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Pointer Math vs. XE2 x64
« Odpověď #3 kdy: 10-07-2012, 08:57:04 »
(I když mě napadá, že to možná bude paralela se zavedením metod pro recordy a co možná největší zatajení objectů, které také podle všeho nemá žádný rozumný důvod, jenom ten, že se to tak Embarcaderu líbí.

Kromě zpřehlednění a zvýšení bezpečnosti jazyka - zkoušel jsi někdy vysvětlovat někomu rozdíl mezi object, class a objektem (tj. ze object sice vypadá jako třída, ale alokuje se na zásobníku jako record a co to znamená)? Ted mluvim za sebe, ale podle mne např. z těch lidí co tady jsou to ví 1%. A reálně ho nepoužívá nikdo. Schválně zkusím dát výhledově na delphi.cz anketu.

Takže z hlediska bezpečnosti jazyka je toto silně problémová oblast a jsem opravdu rád, že je na první pohled jasné rozdíl RECORD a CLASS.

R&D deklarovali, že se snaží minimalizovat potencionálně nebezpečné konstrukce. Mimochodem, jednou z nich je bohužel i WITH.
Embarcadero MVP - Czech republic