Domanda

Recentemente ho scritto del codice che utilizza lo stesso short senza segno per memorizzare due valori, un risultato e un ID, ad esempio:

unsigned short data = new_id();
// result is either 0 or 1 so store it in the rightmost bit and move the id left
data = (data << 1) + get_result();
// ... later ...
// now we can print results like
printf("%u: %u\n", data & 1, data >> 1);

Sarebbe meglio usare semplicemente una struttura per contenere entrambi i valori o questo tipo di cose sono comuni/accettabili?Il programma memorizza già così tanta memoria che ho pensato di iniziare a trovare modi per ridurre la memoria utilizzata.

È stato utile?

Soluzione

a bit (ma solo se si ha realmente bisogno di essere a corto di spazio - sistemi integrati vale a dire )?

typedef struct id_result {
    unsigned int id : 15;
    unsigned int result : 1;
} id_result;

In caso contrario, sì, utilizzare una struttura con le definizioni più complete e significative:

typedef uint16 IDTYPE; /* assuming uint16 exists elsewhere */

typedef struct id_result {
    IDTYPE id;
    bool result;
} id_result;

Altri suggerimenti

A meno che la memoria è incredibilmente stretto, vorrei andare via struct. E 'molto chiaro in questo modo e più facile per la prossima persona che deve mantenere il vostro codice.

Mi viene in mente il momento in cui il M68000 aveva 32 registri di indirizzi bit, ma solo 24 bit di loro sono stati effettivamente utilizzato. I programmatori hanno fatto tutti i tipi di "ottimizzazioni" per memorizzare le informazioni in quelle altre 8 bit. Boy erano loro facce rosso quando versioni successive del circuito integrato, come il M68030, utilizzati tutti i 32 bit.

A meno che non v'è assolutamente scricchiolio della memoria, avrei preferito andare per l'approccio più semplice di avere struttura a due variabili diverse. Aumenta la leggibilità e riduce gli sforzi di manutenzione.

Se questo è fatto al solo scopo di ridurre l'utilizzo della memoria, quindi credo che non si dovrebbe fare. Si sta meglio con una struttura con 2 pantaloncini, che rende il codice molto più leggibile. La quantità di memoria si salva in questo modo molto piccola rispetto ai vantaggi che si ottiene rendendo il codice più mantenibile.

Vi suggerisco di primo profilo il sistema per scoprire se ci sono eventuali perdite di memoria o se qualcuno sta inutilmente stanziando grandi blocchi di memoria, ecc, e quindi provare a risolvere il problema. Se ancora non si riesce a trovare una soluzione, quindi scoprire quale parte del vostro programma occupa la maggior parte della memoria e provare a ridisegnare il proprio modello di allocazione di memoria.

Per coloro che sconsigliano conservare memoria con campi di bit: come il passare degli anni e computer diventano più gigabyte, L1 $ (la memoria veloce) rimane solo poche decine di kilobyte. Per la maggior parte delle applicazioni di oggi, la maggior parte del tempo è trascorso in attesa per la memoria lento ad arrivare nella L1 $.

Poiché la memoria lento è il collo di bottiglia nella maggior parte delle applicazioni, conservando memoria con bitfields può effettivamente aumentare significativamente la velocità di un'applicazione. Questo non era vero venti anni fa.

Montaggio entrambi i pantaloncini in un unico breve se stessi è, a mio parere, più lavoro e più soggetto a errori rispetto all'utilizzo di uno struct. Se si utilizza meno memoria è veramente necessario, è possibile specificare campi di bit con una struct:

struct myStruct {
int data:8;
int result:8;
};

Si ottiene lo stesso risultato memoria di riduzione, mentre aumenta la manutenibilità complessiva del codice.

Le strutture con bitfield sono l'implementazione più comprensibile.Se non usi questo approccio, potresti usare un set di Ben documentato macro che comprime e decomprime la coppia di valori dentro e fuori valori a 16 bit.

Utilizzando struct / oggetti non è necessariamente l'approccio migliore e più chiara.

Supponiamo di avere un insieme di semplici punti di dati interi, ma possono essere cancellati o contrassegnati non valido, se è sufficiente utilizzare il MSB a segnala come 'non utilizzare' allora tutto è necessario aggiungere l'algoritmo è un

if ( item > 0 )
   item += blah

Ma se si dispone di una struttura quindi ogni bit di arithmatic ora ha bisogno di un accesso membri

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top