2012-04-10 11 views
5

Mi chiedo se posso utilizzare i puntatori a 32 bit nelle applicazioni a 64 bit?c: utilizzare i puntatori a 32 bit nell'applicazione a 64 bit?

Il progetto della nostra scuola ci consente solo di compilare il programma c in un'applicazione a 64 bit e di testare il nostro programma per la velocità e l'utilizzo della memoria. Tuttavia, se sono in grado di utilizzare i puntatori a 32 bit, quindi il mio programma si consuma molto meno memoria rispetto a 64 bit, anche forse corre più veloce (più veloce a malloc?)

Grazie per l'aiuto

+0

Come si può essere così sicuro che i puntatori a 32 bit sarà notevolmente più veloce dei puntatori a 64 bit (se non del tutto)? – Mysticial

+1

almeno consuma meno memoria. Non sono sicuro della velocità più veloce delle cose – kevin

+0

Sei sicuro che sarà anche significativo? Avete enormi strutture dati basate su puntatori? Si noti inoltre che l'overhead o le ripetute operazioni di estensione zero del puntatore possono effettivamente causare un * calo * delle prestazioni. – Mysticial

risposta

0

può ridurre la memoria uso - marginalmente - ma non migliorerà la velocità dato che dovresti tradurre il tuo puntatore corta in puntatore assoluto, e questo aggiunge un sovraccarico, inoltre perdi la maggior parte dei benefici di typechecking.

Sarebbe simile a questa:

typedef unsigned short ptr; 
... 

// pre-allocate all memory you'd ever need 
char* offset = malloc(256); // make sure this size is less than max unsigned int 

// these "pointers" are 16-bit short integer, assuming sizeof(int) == 4 
ptr var1 = 0, var2 = 4, var3 = 8; 

// how to read and write to those "pointer", you can hide these with macros 
*((int*) &offset[var1]) = ((int) 1) << 16; 
printf("%i", *((int*) &offset[var1])); 

con un po 'più trucchi, si può inventare il proprio BRK() per aiutare l'allocazione della memoria dal offset.

Ne vale la pena? IMO no.

+1

In senso stretto, questo codice si basa su un comportamento non definito, anche se in pratica probabilmente non causerà problemi di allineamento sulla maggior parte dei sistemi (?). – Lundin

+0

Scusa, ma ... ** Ugh. ** Questo non sarà mai, mai una buona idea ... ma quando si effettua un suggerimento fortemente sconsigliabile, si potrebbe a _least_ aver minimizzato il potenziale di UB: usare 'std :: aligned_storage 'Per il tipo più rigido che si sta memorizzando, usare cast e funzioni C++ adeguati, ecc. –

23

Utilizzo di GCC?

L'opzione -mx32 imposta i tipi int, long e pointer su 32 bit e genera il codice per l'architettura x86-64. (Intel 386 e AMD x86-64 Opzioni):

Poi riferimento :)

+0

Questa è praticamente la strada da percorrere. Nota che hai bisogno di una versione abbastanza recente di gcc (4.7, o 4.6 con varie patch) e un binutile abbastanza recente. – torek

+0

no m32, il nostro TA ha detto che – kevin

+0

Perché non specificarlo all'inizio? Ad ogni modo questa è ancora una risposta molto migliore alla domanda reale (restrizioni arbitrarie pedagogiche nonostante) che l'orribile hack che è stato accettato. –

Problemi correlati