Il set di istruzioni x86-64 aggiunge più registri e altri miglioramenti per semplificare il codice eseguibile. Tuttavia, in molte applicazioni la maggiore dimensione del puntatore è un peso. I byte extra non utilizzati in ogni puntatore intasano la cache e potrebbero persino sovraccaricare la RAM. GCC, ad esempio, crea con il flag -m32
e presumo che questo sia il motivo.Puntatori a 32 bit con ISA x86-64: perché no?
È possibile caricare un valore a 32 bit e trattarlo come un puntatore. Questo non richiede istruzioni aggiuntive, basta caricare/calcolare i 32 bit e caricare dall'indirizzo risultante. Il trucco non sarà tuttavia portatile, poiché le piattaforme hanno mappe di memoria diverse. Su Mac OS X, è riservato l'intero 4 GiB basso dello spazio di indirizzamento. Tuttavia, per un programma che ho scritto aggiungendo immediatamente 0x100000000L
a "indirizzi" a 32 bit prima di utilizzare prestazioni migliorate notevolmente rispetto a veri indirizzi a 64 bit o compilando con -m32
.
C'è qualche impedimento fondamentale per avere una piattaforma a 32 bit, x86-64? Suppongo che il supporto di una simile chimera possa aggiungere complessità a qualsiasi sistema operativo, e chiunque voglia avere quell'ultimo 20% dovrebbe semplicemente farlo funzionare, ma sembra comunque che questo sarebbe il più adatto per una varietà di programmi ad alta intensità di calcolo.
I dati di profilo nella maggior parte delle applicazioni non suggeriscono alcuna perdita significativa a causa della maggiore dimensione del puntatore. – Puppy
Il compilatore Intel ha l'opzione ['Qauto-ilp32'] (http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32 .htm) che "cerca" di utilizzare 32 bit per i puntatori, anche in modalità x64. – Mysticial
@Mysticial ma è più simile ai puntatori "near" e "lontano" vecchio stile, giusto? Questa soluzione è OK, suppongo, ma non è così pulita come quella a cui mi riferisco. – Potatoswatter