Urcite su taketo zmeny treba? Nepomoze to len tym, ktori pisu aplikacie "prasacky"? Ak ano, tak potom nejde o ziadne performance critical aplikacie.
Bobtnanie premennych sa da v C lahko obmedzit (a je mnohokrat vhodne ho obmedzit) tym, ze sa pouzije napriklad int32_t alebo int64_t namiesto long-u. Ak chce niekto rychlost, tak ma int_fast32_t a podobne. V obidvoch pripadoch mi to da aspon zaruku, ze mi nebude vadit napr. na 18bitovy long na obskurnej architekture, kam sa mi nevlezie to, co potrebujem (C specifikacia to dovoluje). Samozrejme by sa toto dalo zaistit kontrolovat cez LONG_MAX a pod, ale to je zbytocna kontrola (+co ked sa mi nieco aj tak nevlezie do datoveho typu?). Cela kontrola sa da lahko vynechat pomocou inych typov v <stdint.h>.
Bobtnanie pointerov je sice nutne, ale na druhu stranu podla mna nie je az tak vidiet. Ano, nieco sa mi natiahne do pamati a pointery budu 2x tak dlhe = o nieco vacsia spotreba pamati. Naproti tomu si myslim, ze sa inde skoro nic neziska - neviem nic o tom, ze by sa zrychlilo vyhladavanie v cache, ked sa hlada podla kratsieho kluca. Podobne je to aj s prenosmi 64bit adresy - prenasa sa tak isto cela naraz ako 32bit adresa - preto tu asi zrychlenie nebude?
Na zaklade coho sa teda usudilo, ze ma toto pomoct?
Ja myslim, ze duvod, proc se to dela je prave to "bobtnani pointeru". Prece jen, u aplikaci, ktere maji malou spotrebu pameti jsou ty 4 bajty nul navic zbytecna zatez pro cache a vubec pamet, ktera je uzke hrdlo na modernich procesorech (a prakticky se to pak projevi v tom namerenem zrychleni, o kterem se pise v clanku).
Vzdycky jsem si myslel, ze 64-bitove architektury skonci nejakym druhem kompromisu s 32-bitovymi. Tohle napriklad teoreticky umoznuje alokovat bezne objekty pod 4GB, a nad tim pouze specialni velke objekty, ktere muzeme explicitne adresovat dlouhym pointerem (pripadne mit HW podporu pro kompresi/dekompresi dlouhych zarovnanych pointeru). Aplikace si tak bude moci vybrat, na zaklade typu dat ukladanych do pameti (mnozstvi pointeru), kam je ulozit, a to povede k optimalnim vysledkum.
Ten kompromis je mozny uz ted. I v 64bit modu je mozne vykovavat 32bit instrukce. Staci kdyz tu instrukci prefixujete jednim bajtem. A o tohle asi v tom x32 pujde. Napriklad virtualni tabulka metod. Opravdu je potreba tam mit 64bit pointery? Dokaze nekdo vubec vytvorit binarku vetsi nez 4GB?
Jestli nejsem uplne vedle tak ani ten 64bit mod neni uplne cely vyuzit. Myslim, ze hornich 16 bitu adresy muze mit nejakty specialni vyznam anebo musi mit stejnou hodnotu jako bit 47.
O binárku větší jak 4G nejde. Je tu nějakej linker, kterej tu aplikace po spuštění linkuje s knihovnama. V x86-64 linuxu jdou většinou knihovny do adres nad 4GB a samotná binárka jde pod 4GB.
Jinak větší velikost ukazalů nemusí být pro některé aplikace problém. Kompilátor není debil (většinou) a dokáže použít relativní adresování (např. vůči RIP či nějaký tý adrese, kam byla nahrána knihovna/binárka, což je prakticky to position independent code, které stejně používá většina knihoven). Problém to asi může být spíše u aplikací, co používají hodně malých objektů a ukládají v nich ukazatele na jiné, např. nějaký stromy, spojový seznamy, kde se prostě většinou použije absolutní 64bit ukazatel (programátor si to ale prakticky může řešit sám tím, že si bude uchovávat třeba 32bit offsety k nějakýmu základu a pak je bude přičítat, je to pak přeci jen jedna instrukce tak jako tak.
Jinak já jsem známý odpůrce 32bit šmejďáren, který tu nemají co dělat na x86-64 procesorech, vypínám CONFIG_IA32_SUPPORT v kernelu (na které momentálně x32 závisí, ale plánuje se to změnit). Tenhle x32 vidím jen jako další šmejďárnu, né ani tak kvůli 32bit ukazatelům, jako kvůli tomu, že to umožní prasáckým programátorům portovat jejich rozbitý kód s chybnými předpoklady velikostí datových typů, s prasáckými přetypováními ukazatelů na čísla s předpokládanou velikostí a podobnými prasárnami, místo toho, aby byli donuceni opravit si vlastní rozbitý kód.
Brání v tom volací konvence funkcí. Nějak jsem to nestudoval, ale věřím, že díky většímu množství registrů se na x32 bude, stejně jako u x86-64, používat fastcall pro všechno, tj. argumenty se předávají v registrech. V x86 se argumenty cpaly na zásobník. Proto ta kombinace nebude možná.