2010-07-17 6 views
7

Quando si sposta un'applicazione da 32 bit a 64 bit, dove si verificherà un maggiore utilizzo della memoria?Quanto è probabile che l'utilizzo della memoria aumenti quando ci si sposta a 64 bit?

Capisco che i puntatori raddoppieranno le dimensioni, sospetto che i caratteri in una stringa siano "raggruppati" per utilizzare la memoria in modo più efficiente (quindi non userà molta più memoria).

In quale altro caso l'utilizzo della memoria potrebbe aumentare? Esiste un punto in cui diminuirebbe o dove le operazioni non aritmetiche vedrebbero un vantaggio in termini di velocità?

+1

Non solo le dimensioni del puntatore aumentano ma anche le lunghe e lunghe dimensioni senza segno. – pmr

+0

+1 pmr; E Splendidamente spiegato qui: http://developers.sun.com/solaris/articles/ILP32toLP64Issues.html – bits

+0

Vedi anche questo pdf una volta: http://scc.ustc.edu.cn/zlsc/czxt/200910/W020100308601263456982.pdf – bits

risposta

7

È possibile visualizzare un allineamento aggiuntivo per il costo di alcuni byte aggiuntivi qua e là. Il codice sarà probabilmente più grande a causa delle costanti a 64 bit negli operandi.

Per quanto riguarda la velocità, è possibile che si verifichino rallentamenti dovuti all'aumento dell'utilizzo della memoria. La cache della CPU si riempirà più rapidamente.

Ho visto significativi vantaggi di velocità che vanno da x86 andando a x64, perché x86 ha molti meno registri rispetto all'architettura x64. I compilatori utilizzano i registri aggiuntivi per ottimizzare meglio il codice. Ho visto il 15% di accelerazione su hardware identico.

+0

Interessante, non avevo considerato la cache.Quindi un compilatore x86 non userà tutti i registri disponibili su una CPU compatibile a 64 bit? C'è un modo per forzarlo? –

+4

@Peter Gli eseguibili a 32 bit non possono accedere al registro a 64 bit, per quanto ne so. Il modo migliore per dire al compilatore che "può usare" i registri a 64-bit è dire di emettere i file eseguibili a 64 bit. – luiscubal

+3

@Peter: No, non c'è modo di fare riferimento a un registro x64 con le istruzioni x86. Compilare a 64 bit se si desidera utilizzare le varie estensioni a 64 bit. – jalf

3

Come hai notato, i puntatori saranno più grandi. A seconda dell'architettura del processore, potrebbe anche essere ints e/o longs. Le stringhe devono rimanere della stessa dimensione ma essere allineate in modo diverso in memoria per l'efficienza. Generalmente, l'allineamento della memoria delle strutture dati sui limiti a 64 bit causerà un aumento della frammentazione nella maggior parte dei casi.

Anche lo spazio di indirizzamento del processo può apparire (in molte architetture) molto più grande con puntatori del frame stack che appaiono in memoria alta (e crescenti verso il basso) ma poiché questi sono invariabilmente dei puntatori di memoria virtuale l'effettiva memoria fisica in uso dall'applicazione di solito è considerevolmente più piccolo.

+0

Improbabile che int sia maggiore. I due modelli a 64 bit più comuni sono LP64 (Posix) e LLP64 (Windows) e in entrambi i casi, int sono ancora a 32 bit. –

2

In alcuni casi è possibile risparmiare memoria. Il codice effettivo potrebbe essere un po 'più corto nei posti, perché sono necessari meno carichi/negozi a causa dell'aumento del numero di registri. La convenzione di chiamata predefinita passa i parametri nei registri, ad esempio.

Nel complesso, un'applicazione a 64 bit probabilmente utilizzerà un po 'di memoria un po' di 32 bit. Ma non sarà un vero affare.

+0

"Nel complesso, un'applicazione a 64 bit probabilmente userà un po 'più di memoria di una a 32 bit." Ma non ci vorranno 8 byte a causa di problemi di allineamento? ;) – tstenner

2

A seconda dell'architettura, il codice può anche aumentare. Le variabili globali e le costanti sono spesso referenziate tramite indirizzi assoluti (che vengono trasferiti dal programma di caricamento), questi riferimenti sono 64 bit in modalità 64 bit. Su x64 c'è un'istruzione esplicita per le costanti a 64 bit, quindi il programma aumenterà solo della dimensione della costante. Anche le istruzioni Jump e call possono aumentare, ma ciò dipende da molti parametri del compilatore e del linker. Su altre architetture può anche essere peggio. Su SPARC, ad esempio, quando si passa da 32 a 64 bit è possibile far crescere significativamente il codice. Poiché lo sparc non ha un'istruzione che può caricare più di 22 bit, quando carica l'indirizzo a 32 bit di una variabile o costante globale, ha bisogno di 2 istruzioni, per caricare una costante a 64 bit ha bisogno anche di 5 istruzioni con 3 registri. Aumentando la pressione del registro, il compilatore spesso perde opportunità di ottimizzazione, rendendo il codice molto più grande del necessario.

Problemi correlati