Mi piacerebbe generalizzare operatori bit a bit in C++ senza pensare che la struttura sottostante sia una matrice.Metaprogrammazione per l'ottimizzazione dell'algoritmo di archiviazione/runtime, C++
Come esempio ... se voglio rappresentare 86 bit vorrei usare una struttura di struttura/classe come:
typedef struct {
uint64_t x[1];
uint16_t y[1];
uint8_t z[1];
} sampleStruct;
Invece se mi sarebbe piaciuto di destinare 160 bit userei una struttura come:
typedef struct {
uint64_t x[2];
uint32_t y[1];
} sampleStruct;
Immagino che una soluzione banale, ma non ottimale, per lo storage sia assumere che tutti i blocchi siano uniformi e allocare il minimo di quelli st copre le dimensioni che sto implementando, tuttavia anche per una questione di esercizio preferisco il modo in cui ho esposto.
A me suona chiaro che dovrei usare metaprogrammazione per risolvere il problema, quindi devo definire correttamente
template <int I>
typedef sampleStruct {
//something
}
Comunque io non sono un grande esperto di C++ template metaprogrammazione quindi vorrei capire quale sarebbe il modo migliore per attuare i diversi tipi di campione struct varing I. so come decidere la migliore "copertura" per la mia lunghezza sarebbe qualcosa di simile:
N64 = I/64;
RemN = I%64;
if(0 < RemN <= 8) {
add uint8_t var;
} else if (8 < RemN <= 16) {
add uint16_t var;
} else if (16 < RemN <= 24) {
add uint16_t var;
add uint8_t var;
} else {
//Similarly handle the other cases from 24 < RemN < 64
}
Cosa posso fare per ottenere ciò che Voglio fare?
Immagino anche che i blocchi arrigrati correttamente consentirebbero di ottenere prestazioni leggermente migliori rispetto ad altre possibili implementazioni.
Sperando che sia abbastanza chiaro ... (Si consideri C++ 11 o più versioni recenti).
Suoni come si desidera ['std :: bitset'] (http://en.cppreference.com/w/cpp/utility/bitset). – Daniel
Non sapevo che esistesse, funziona nel modo in cui ho descritto? (lo stoccaggio intendo). – user8469759
c'è un discorso su questo: https://www.youtube.com/watch?v=ea5DiCg8HOY –