Tradizionalmente gli eseguibili vengono mappati all'indirizzo di destinazione desiderato, se non è ancora in uso. Non puoi mappare a 0, poiché la parte più bassa dello spazio degli indirizzi è riservata (causa l'arresto anomalo del dereferenziamento del puntatore nullo, invece dell'accesso alla memoria che non avevi intenzione di acquisire).
Poiché si carica un singolo file .exe in un processo, non è necessario utilizzare un unico indirizzo di base. Quindi la maggior parte dei file .exe mantiene il valore predefinito 0x400000
. Spesso manca una tabella di riposizionamento e quindi deve essere caricato a quell'indirizzo.
Per le DLL le cose sono un po 'più complicate, dal momento che il loro indirizzo di destinazione può essere già in uso. In tal caso verranno mappati su un altro indirizzo e una tabella di riposizionamento verrà utilizzata per correggere parti del suo codice che ora devono puntare ad altri indirizzi. Questa correzione costa sia la CPU che la memoria (gli eseguibili sono mappati come copia-su-scrittura e la correzione significa che l'applicazione ottiene una copia univoca della dll). Gli indirizzi di base per le DLL vengono in genere scelti per evitare sovrapposizioni e quindi il trasferimento.
Al giorno d'oggi le cose sono diverse. La RAM è molto più economica, quindi il costo della delocalizzazione non è più così importante. D'altra parte la sicurezza è molto importante ora. Quindi usiamo un processo chiamato ASLR dove gli eseguibili sono mappati a indirizzi non guidabili. Questo rende l'indirizzo di base specificato dall'eseguibile piuttosto privo di significato.
Quindi gli executables che possono scegliere il proprio indirizzo di base è un'ottimizzazione delle prestazioni che è stata utile su computer lenti con poca RAM ma non è più utile nei sistemi moderni poiché MS ha deciso di scambiare un po 'di prestazioni per una maggiore sicurezza.